Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 7, 2014 21:18:11

Minuteman
Зарегистрирован: 2013-08-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Hacking attempt + captcha для Login Form

Да просто не могу понять, как корректно вставить эту "проверку', когда логин и пароль не подходят. Просто когда без этого конструктора __init__ было, все сообщения об ошибках выдавались. Но то что написал товарищ FishHook, работает, и каптча срабатывает когда число попыток больше нуля. Вопрос, как восстановить так, чтобы еще и на неправильный username или password выводило ошибку.


Пытаюсь модифицировать __init__:

    def __init__(self, *args, **kwargs):
        ha = None
        if "hacking_attempts" in kwargs:
            ha = kwargs.pop("hacking_attempts")
        cleaned_data = super(LoginForm, self).__init__(*args, **kwargs)
        user = authenticate(username=cleaned_data['username'], password=cleaned_data['password']) #added
        if user is None:                                                                                                     #added
                raise forms.ValidationError(u'Имя пользователя и пароль не подходят')#added
        if ha:
            self.fields["captcha"] =  CaptchaField(label=u'Введите код с картинки:')

но выводит следующую ошибку:
'NoneType' object has no attribute ‘__getitem__’

Отступать не хочется и хочу добиться вменяемого кода .
Спасибо за подсказки, ответы и советы

Офлайн

#2 Фев. 7, 2014 21:47:07

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Hacking attempt + captcha для Login Form

Выложите полностью что получилось тяжело по сообщениям собирать.

Офлайн

#3 Фев. 7, 2014 22:18:12

Minuteman
Зарегистрирован: 2013-08-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Hacking attempt + captcha для Login Form

Кину части отвечающие за данный функционал с моделей форм и контроллеров чтобы было понятно:

views.py:

def log_in(request):
    if request.method == 'POST':
        try:
            id_ = User.objects.get(username=request.POST["username"]).pk
            profile = UserProfile.objects.get(id = id_)
            form = LoginForm(request.POST, hacking_attempts=profile.hacking_attempts)
        except User.DoesNotExist:
            return HttpResponseRedirect('/login')
#Ранее просто пытался вычислить  id_ = User.objects.get(username=request.POST["username"]).pk без всяких try ...excerpt
  
        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))

models.py:
GENDER_CHOICES = (('m', 'Male'), ('f', 'Female'))
class UserProfile(models.Model):
    user = models.OneToOneField(User)
    #location = models.CharField(max_length=100)
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
    hacking_attempts = models.IntegerField(max_length=20, default=0)
    
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)


forms.py:

class LoginForm(forms.Form):
    username = forms.CharField(label=u'Имя пользователя')
    password = forms.CharField(label=u'Пароль', widget=forms.PasswordInput)
    #captcha = CaptchaField(label=u'Введите код с картинки:')
    
    def __init__(self, *args, **kwargs):
        ha = None
        if "hacking_attempts" in kwargs:
            ha = kwargs.pop("hacking_attempts")
        cleaned_data = super(LoginForm, self).__init__(*args, **kwargs)
        #user = authenticate(username=cleaned_data['username'], password=cleaned_data['password'])
        #if user is None:
        #        raise forms.ValidationError(u'Имя пользователя и пароль не подходят')
        if ha:
            self.fields["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

и вот urls.py:

    url(r'^login/$', 'blog.views.log_in', name='log_in'),

То есть получается все работает, но в forms.py то что написано в методе clean не выдает ошибочные сообщения когда логин или пароль неверны.

Отредактировано Minuteman (Фев. 7, 2014 22:19:49)

Офлайн

#4 Фев. 15, 2014 10:43:11

risfio
Зарегистрирован: 2014-02-15
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Hacking attempt + captcha для Login Form

Первое , что приходит в глову - а вы ,когда вводите заведомо неверные данные, вводите имя уже зарегистрированного пользователя?

Отредактировано risfio (Фев. 15, 2014 10:58:01)

Офлайн

#5 Фев. 18, 2014 16:13:52

Minuteman
Зарегистрирован: 2013-08-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Hacking attempt + captcha для Login Form

если ввожу пользователя которого не существует, то приходится делать для него исключение и типа редиректить. если пользователь есть и у него пароль неверный, то выводится каптча(могу и месседж тулить что пароль неверный).
Мне необходимо чтобы при любом варианте выдавало что имя пользователя или пароль неверный и я .. не пихал костыли типа всяких редиректов.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version