Форум сайта python.su
Всем привет.
Написал форму для аутентификации и решил прикрутить к ней каптчу. С каптчей изобретать велосипед не решился и взял django-simple-captcha. Но захотел я прикрутить такую вещь, что если пользователь по логину(а не по айпишнику) вводит неверно пароль третий раз, то только в том случае ему предстоит ввести код с каптчи. Если вводит верно то параметр hacking_aatempts(см ниже) обнуляется.
Далее сгенерил я таблицу userprofile один-к-одному с юзером и там добавил поле hacking_attempts:
class UserProfile(models.Model): user = models.OneToOneField(User) ... hacking_attempts = models.IntegerField(max_length=20)
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))
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
Офлайн
Как то так
class UserProfile(models.Model): user = models.OneToOneField(User) ... hacking_attempts = models.IntegerField(default=0)
class LoginForm(forms.Form): username = forms.CharField(label=u'Имя пользователя') password = forms.CharField(label=u'Пароль', widget=forms.PasswordInput) def __init__(self, *args, **kwargs): ha = None if "hacking_attempts" in kwrags: ha = kwargs.pop("hacking_attempts") super(LoginForm, self).__init__(*args, **kwargs) if ha: self.fields["captcha"] = CaptchaField(label=u'Введите код с картинки:')
def log_in(request): if request.method == 'POST': profile = UserProfile.objects.get(user__username=request.POST["username"]) form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts) if form.is_valid(): ..... profile.hacking_attempts = 0 profile.save() return HttpResponseRedirect('/profile') else: profile.hacking_attempts += 1 profile.save() form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts) else: form = LoginForm() return render_to_response('login.html', {'form': form}, context_instance=RequestContext(request))
Офлайн
Сделал все как выше, перегенерил таблицу userprofile, где hacking_attempts сделал default=0. И вот какой экшн получился у контроллера log_in():
def log_in(request): user = User() #profile = UserProfile() if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): if form.get_user(): profile = user.get_profile() profile.hacking_attempts = 0 profile.save() login(request, form.get_user()) return HttpResponseRedirect('/profile') else: profile.hacking_attempts += 1 profile.save() form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts) else: form = LoginForm() return render_to_response('enter.html', {'form': form}, context_instance=RequestContext(request))
url(r'^login/$', 'blog.views.log_in', name='log_in'),
Офлайн
MinutemanИ что надеемся получить? Вы id юзера как-то сообщили джанге или какие-то другие атрибуты, по которым его можно идентифицировать? Это некий абстрактный юзер, у которого нет никакого профиля. Ну откуда программа знает, что на том конце провода сидит Вася Иванов, если он еще не залогинился? Единственная информация, определяющая пользователя, у Вас - это юзернеэм из LoginForm. При чем в форме у Вас есть готовый метод для получения пользователя.
user = User()
profile = user.get_profile()
Офлайн
Сделал таким образом, как вы сказали
def log_in(request): if request.method == 'POST': profile = UserProfile.objects.get(user__username=request.POST["username"]) form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts) if form.is_valid(): if form.get_user(): profile.hacking_attempts = 0 profile.save() login(request, form.get_user()) return HttpResponseRedirect('/profile') else: profile.hacking_attempts += 1 profile.save() form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts) else: form = LoginForm() return render_to_response('enter.html', {'form': form}, context_instance=RequestContext(request))
Офлайн
вот кусок из views.py:
if request.method == 'POST': id_ = User.objects.get(username=request.POST["username"]).pk if (not id_ is None): profile = UserProfile.objects.get(id = id_) form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts)
try: id_ = User.objects.get(username=request.POST["username"]).pk except: id_ = None
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
Офлайн
>>>Или в forms.py перестает действовать данный метод:
Что значит перестаёт действовать? Вы хотите залогинить несуществующего юзера? Или какого поведения Вы хотите?
Офлайн
FishHook
Что значит перестаёт действовать? Вы хотите залогинить несуществующего юзера? Или какого поведения Вы хотите?
Офлайн
user = authenticate(username=cleaned_data['username'], password=cleaned_data['password']) if user is None: raise forms.ValidationError(u'Имя пользователя и пароль не подходят')
Офлайн
FishHook
о есть, сначала проверить, что лежит в cleaned_data, а потом уже логинить узера?
user = authenticate(username=cleaned_data['username'], password=cleaned_data['password'])
Офлайн