Написал форму для аутентификации и решил прикрутить к ней каптчу. С каптчей изобретать велосипед не решился и взял django-simple-captcha. Но захотел я прикрутить такую вещь, что если пользователь по логину(а не по айпишнику) вводит неверно пароль третий раз, то только в том случае ему предстоит ввести код с каптчи. Если вводит верно то параметр hacking_aatempts(см ниже) обнуляется.
Далее сгенерил я таблицу userprofile один-к-одному с юзером и там добавил поле hacking_attempts:
class UserProfile(models.Model): user = models.OneToOneField(User) ... hacking_attempts = models.IntegerField(max_length=20)
Далее привожу action log_in во views.py с помощью которого собственно и захожу:
def log_in(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): if form.get_user(): if form.get_user().is_active: login(request, form.get_user()) return HttpResponseRedirect('/profile') else: return HttpResponseRedirect('/') return render_to_response('not_activated.html', context_instance=RequestContext(request)) else: form = LoginForm() return render_to_response('enter.html', {'form': form}, context_instance=RequestContext(request))
И теперь сама форма в forms.py
class LoginForm(forms.Form): username = forms.CharField(label=u'Имя пользователя') password = forms.CharField(label=u'Пароль', widget=forms.PasswordInput) captcha = CaptchaField(label=u'Введите код с картинки:') def clean(self): cleaned_data = super(LoginForm, self).clean() if not self.errors: user = authenticate(username=cleaned_data['username'], password=cleaned_data['password']) if user is None: raise forms.ValidationError(u'Имя пользователя и пароль не подходят') self.user = user return cleaned_data def get_user(self): return self.user or None
Как видите каптчу я сейчас применил на постоянку. Но я не могу понять где можно внедрить эту проверку на hacking attempts в плане в forms.py или во views.py? Просто каптча так подключается что вариантов не остается на гибкое внедрение. Или я не прав? Как это может выглядеть?
Прошу помощи. Спасибо.