30 мая 2011 г.

Как сделать Captcha для Django

Посмотрев примеры CAPTCHA для Django в сети, не нашел понравившийся. Поэтому решил набросать не сложную свою. Для подключения понадобится в файле urls.py прописать паттерн:

(r'^captcha/$', 'здесь_полный_путь_к_вьюхе.render_captcha'),

Далее прописываем саму "вьюху":

from django.http import HttpResponse
import Image, ImageFont, ImageDraw
import random

def render_captcha(request):
    
    def color(down=25, up=75):
        color = []
        for i in range(3):
            color.append(random.randint(down, up))
        return tuple(color)
    
    path = 'путь_до_шрифтов'
    chars = 'здесь_список_символов_для_каптчи'
    fonts = ('здесь_кортеж_названий_желаемых_загруженных_шрифтов',)
    img = Image.open('фоновое_изображение')
    drawable = ImageDraw.Draw(img)
    code = ''
    for i in range(5):
        size = random.randint(20, 24)
        font = fonts[ random.randint(0, len(fonts) - 1) ]
        font = ImageFont.truetype (path + font, size)
        char = chars[ random.randint(0, len(chars) - 1) ]
        code += char
        drawable.text ((10 + 27 * i, 2), char, fill = color(), font = font)
    request.session['captcha'] = code
    response = HttpResponse(mimetype='image/png')
    img.save(response, 'png')
    return response

Для её функционирования должен быть установлен модуль PIL. Также загрузите по пути path упомянутые в функции файлы шрифтов и пропишите путь до 'фоновое_изображение'.

Далее в своих формах, где Вами предусмотрена каптча определите следующее поле:

    captcha = forms.CharField(
        label = 'Код с изображения',
        max_length = 5,
        help_text = '<img src="/captcha/" alt="" />'
    )
переопределите метод __init__ и определите метод clean_captcha:
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(НазваниеКлассаФормы, self).__init__(*args, **kwargs)
    
    def clean_captcha(self):
        if not self.request:
            raise ValidationError('Wrong param in constructor!')
        if self.cleaned_data['captcha'] != self.request.session['captcha']:
            raise ValidationError('Не совпадает введенный код с кодом на изображении!')

Теперь достаточно во вьюхе, обрабатывающей запрос с формой, в которой нужна каптча передавать дополнительно параметр request. Примерно так:

def your_view_function(request):
    # some actions...
    if request.method == 'POST':
        form = НазваниеКлассаФормы(request.POST,  request = request)
        # some actions with form data...

1 комментарий:

K313 комментирует...

CAPTCHA_K313
created: 0.0015 sec.

Отправить комментарий