31 мая 2011 г.

CAPTCHA для Django. Альтернативный вариант.

В предыдущей моей записи я рассказал как можно написать свою CAPTCHA для Django. Недостатком этого способа мне видится то, что до функций обработки запросов ("вьюх") не всегда есть доступ, точнее он не всегда оправдан. Например, когда "вьюхи" находятся в сторонних приложениях. Эту проблему можно решить несколькими способами. Один из них — использовать Middleware.

Алгоритм решения по началу похож. Также добавляем паттерн в urls.py. Также прописываем функцию, выводящую CAPTCHA. Как это сделать — смотрите в предыдущей записи. А вот далее, в класс формы "залазить" не нужно. Достаточно прописать класс Middleware примерно так:

from django.shortcuts import render_to_response
from django.template import RequestContext

class CaptchaMiddleware(object):
    
    def process_request(self, request):
        '''
        Обработчик CAPTCHA
        '''
        if request.method == 'POST':
            captcha = request.POST.get('captcha', None)
            
            if captcha == None:
                return
            
            elif captcha == request.session['captcha']:
                return
            
            elif captcha != request.session['captcha']:
                return render_to_response(
                    'шаблон_ошибочного_ввода_кода',
                    context_instance = RequestContext(request)
                )

и добавить в settings.py в кортеж MIDDLEWARE_CLASSES еще один класс:

'путь_до_класса.CaptchaMiddleware',

В шаблонах же, где нужно использовать каптчу, добавляем:

<input type="text" name="captcha" maxlength="5" value="" />

В результате все запросы форм, где присутствует поле captcha будут проверяться и в случае совпадения с кодом каптчи обработка продолжится, в случае неудачи — произойдет редирект на шаблон ошибки.

Здесь можно лишь добавить, что если вы не хотите, чтобы пользователь терял уже заполненные данные формы в случае неправильного ввода кода, этот случай можно обработать Javascript-ом массой способов. Я сделал через AJAX.

2 комментария:

Алексей комментирует...

Так получается в классе форме все такие остается поле captcha?

Иван комментирует...

Можно добавить

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