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