понедельник, 18 мая 2009 г.

Captcha в Django

Семейство captcha реализаций


Решил разобраться какие есть решения captcha в Django. Немного погуглив можно выделить следующие:
1. django-yacaptcha
2. django-simple-captcha
3. reCAPTCHA
4. Captcha
5. supercaptcha

ReCaptcha


Каждая из них интересное и имеет свои плюсы и минусы, но больше всего мне понравилось reCaptcha. Ну выделить наверное можно следующие преимущества:
- Картинка и голосовая речь в данной реализации тяжело программно анализируется.
- Словосочетания выбираются из существующего текста, т.е. если какой то символ изменен практически до неузнаваемости, то прочитав все слово можно догадаться по смыслу что за символ от нас требуется.
- Генерируется картинка/голосовая речь на сайте-провайдере, там же и идет проверка на правильность ввода, что в свою очередь частично снимает груз за отслеживанием новшеств в использовании/генерации captcha.

Сразу захотелось ее попробовать, так сказать увидеть в действии и оценить на сколько легко ее внедрять. Для внедрения прошел по следующим этапам:

1. Регистрация сайта
Проверка кода reCaptcha осуществляется на сервере recaptcha.net и для использования необходимо зарегистрировать свой сайт. После регистрации получаем два ключа "Public Key", "Private Key".

Эти настройки и некоторый другие прописываем в settings.py:

# your project's settings.py  
RECAPTCHA_PUBLIC_KEY = 'my_public_key'  
RECAPTCHA_PRIVATE_KEY = 'my_private_key'  
RECAPTCHA_THEME = 'white' #optional  
# lang value is taken from LANGUAGE_CODE, example  
LANGUAGE_CODE = 'ru'
где my_public_key - "Public Key" полученный после регистрации,
my_private_key - "Private Key" соответственно.

2. Добавляем реализацию reCaptcha form в приложение.
Ну что бы не изобретать свой велосипед решил следовать описанию в блоге ">>> k0001", для дальнейшего внедрения нужно было немного подправить код. Измененную версию можно скачать тут.

В результате в файле recaptcha_forms.py у меня была реализация RecaptchaForm, с внедренным полем reCaptcha.

3. Реализовавыем свою форму с reCaptcha полем.
Наследуем свой класс от RecaptchaForm и реализуем вьюху как описано далее:

from django.shortcuts import render_to_response  
import django.forms as forms  
from recaptcha_forms import RecaptchaForm  

# create our form inheriting from RecaptchaForm  
class NewAnimalForm(RecaptchaForm):  
name = forms.CharField(label='animal name')  
legs = forms.IntegerField(label='number of legs')  

# and the view would be... just a little different.  
# when the form is created, we explicitly pass the remote_ip  
# to the form constructor. And that's all the magic.  
def new_animal(request):  
remote_ip = request.META['REMOTE_ADDR']  
if request.method == 'POST':  
form = NewAnimal(remote_ip, request.POST)  
if form.is_valid():  
# if we get here, the captcha solution the user provided  
# was ok, so do whatever you want to do with your data here.  
# ...  
else:  
form = NewAnimalForm(remote_ip)  

return render_to_response('animals/new_animal.html', {'form': form }) 
Подключаем страницу и пользуемся.
Не претендую на оригинальность и лавры, данная статья есть лишь вводной информацией, все же больше всего интересует интеграции django.contrib.comments с reCaptcha.

Комментариев нет:

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