Форум сайта python.su
0
Всем привет.
Написал форму для аутентификации и решил прикрутить к ней каптчу. С каптчей изобретать велосипед не решился и взял 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
Офлайн
568
Как то так
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))
Офлайн
0
Сделал все как выше, перегенерил таблицу 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'),
Офлайн
568
MinutemanИ что надеемся получить? Вы id юзера как-то сообщили джанге или какие-то другие атрибуты, по которым его можно идентифицировать? Это некий абстрактный юзер, у которого нет никакого профиля. Ну откуда программа знает, что на том конце провода сидит Вася Иванов, если он еще не залогинился? Единственная информация, определяющая пользователя, у Вас - это юзернеэм из LoginForm. При чем в форме у Вас есть готовый метод для получения пользователя.
user = User()
profile = user.get_profile()
Офлайн
0
Сделал таким образом, как вы сказали
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))
Офлайн
0
вот кусок из 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
Офлайн
568
>>>Или в forms.py перестает действовать данный метод:
Что значит перестаёт действовать? Вы хотите залогинить несуществующего юзера? Или какого поведения Вы хотите?
Офлайн
0
FishHook
Что значит перестаёт действовать? Вы хотите залогинить несуществующего юзера? Или какого поведения Вы хотите?
Офлайн
568
user = authenticate(username=cleaned_data['username'], password=cleaned_data['password']) if user is None: raise forms.ValidationError(u'Имя пользователя и пароль не подходят')
Офлайн
19
FishHook
о есть, сначала проверить, что лежит в cleaned_data, а потом уже логинить узера?
user = authenticate(username=cleaned_data['username'], password=cleaned_data['password'])
Офлайн