captcha, verification code

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
========= config file begin ===============

NAME = u'captcha' 

LETTERS = u'1234567890' #ABCDEFGHIJKLMNOPQRSTUVWXYZ'

COLOURS = (
        (203,61,27),
        (39,151,58),
        (0,139,120),
        (0,151,220),
        (1,53,146),
        (129,30,104),
        (183,1,111),
        (230,0,58),
        (0,0,0),
       )

FONTS = (
        u'ariblk.ttf',
        u'comic.ttf',
        u'georgia.ttf',
        u'impact.ttf',
        u'tahomabd.ttf',
       )

FONT_SIZE = 12

LENGTH = 5

========= config file end ===============



========= widgets file begin ===============

class CaptchaWidget(Widget):
    
    def render(self, name, value, attrs = None):
        '''验证码HTML内容'''
        
        attrs = self.build_attrs(attrs, name=name)
        output = [u'<img height="60" src="/member/captcha.png" />']
        output.append(u'<input %s style="text-transform:uppercase" />' % flatatt(attrs))
        
        return mark_safe(u'<br/>'.join(output))  

========= widgets file end ===============



========= models file begin ===============

class Captcha:
    '''验证码'''
    
    def __init__(self, request, *args, **kwargs):
        self.request = request
        
    @staticmethod
    def text():
        return ''.join([random.choice(captcha.LETTERS) for i in range(captcha.LENGTH)])
    
    def get(self):
        return self.request.session.get(captcha.NAME, '')
    
    def destroy(self):
        self.request.session[captcha.NAME] = ''
        
    def create(self):
        self.request.session[captcha.NAME] = self.text()

========= models file end ===============



========= views file begin ===============

def image(request):
    """验证码图片"""
    
    captcha_text = Captcha(request).get()
    response = HttpResponse()
    if captcha_text:
        image = Image.new("RGBA", (captcha.LENGTH * captcha.FONT_SIZE - 26, captcha.FONT_SIZE), (0,0,0,0))
        canvas = ImageDraw.Draw(image)
        
        for i in range(0, len(captcha_text)):
            # font = ImageFont.truetype(choice(captcha.FONTS), captcha.FONT_SIZE)
            # canvas.text((captcha.FONT_SIZE*i+2, -4), captcha_text[i], font = font, fill = choice(captcha.COLOURS))
            horizon = 1; verticality  = -1
            if i>0: horizon = (captcha.FONT_SIZE - 5) * i
            if i%2 == 0: verticality = 2
            canvas.text((horizon, verticality), captcha_text[i], fill = choice(captcha.COLOURS))
            
        out = StringIO()
        image.save(out, "PNG")
        out.seek(0)
        response['Content-Type'] = 'image/png'
        response.write(out.read())
        
    return response

========= views file end ===============

More like this

  1. Simple Age Verification Middleware by eculver 4 years, 8 months ago
  2. Captcha without Freetype or the Python Imaging Library (PIL) by gregb 4 years, 10 months ago
  3. Mathematical Captcha by dogada 6 years, 4 months ago
  4. Simple random file CAPTCHA by jeverling 2 years, 1 month ago
  5. Include captchas from recaptcha.net by b23 6 years, 6 months ago

Comments

(Forgotten your password?)