Посмотрев примеры 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 комментарий:
CAPTCHA_K313
created: 0.0015 sec.
Отправить комментарий