AuthenticationForm无法正常工作

时间:2013-06-01 22:19:32

标签: python django

我正在尝试使用Django,我尝试创建一个登录/注册应用程序。这是我卡住的地方 - 我能够注册用户,但我无法使用它们登录。这是我认为相关的代码:

views.py

def login(request, template='accounts/sign_in.html'):
    if request.user.is_authenticated():
        return redirect(reverse('games'))
    if request.method == 'POST':
        post = request.POST.copy()
        if 'password' in post:
            post['password'] = make_password(post['password'])
        form = AuthenticationForm(data=post)

        if form.is_valid():
            login(request, form.get_user())
            messages.success(
                request, "Successfully logged in.", extra_tags='success')
            return redirect(reverse('games'))
        else:
            messages.warning(
                request, "Wrong username or password." + request.POST['username'] + " " + request.POST['password'], extra_tags='error')
            return redirect(reverse('login'))
    return views.login(request, template)

def register(request, template='accounts/sign_up.html'):
    if request.user.is_authenticated():
        return redirect(reverse('home'))
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            new_user = User(
                username=form.cleaned_data['username'],
                password=make_password(form.cleaned_data['password1']),
                is_active=True,
            )
            new_user.save()

            messages.success(request, "Your account was successfully created.")
            return redirect(reverse('games'))
    else:
        form = RegisterForm()

    return render(request, template, {'register_form': form})

当我尝试使用我创建的用户(用户名:qwe,密码:qweqweqwe)登录时,我会再次登录,但会在消息中打印完全相同的用户名和密码:

Wrong username or password.qwe qweqweqwe

然而,当我尝试交互式shell时,这就是我得到的:

>>> User.objects.all()
[<User: admin>, <User: asd>, <User: qwe>]
>>> User.objects.all()[2]
<User: qwe>
>>> User.objects.all()[2].password
u'pbkdf2_sha256$10000$HM2k6uDntJ68$DLqHKcGxtJG7pJC7tbZcm29vB88LEgaw2xroqZEkTFw='

所以我有这样的用户,这是一个有效的帐户。

2 个答案:

答案 0 :(得分:1)

我很确定你不需要在这个中呼叫make_password

if 'password' in post:
    post['password'] = make_password(post['password'])
form = AuthenticationForm(data=post)

将普通request.POST传递给data,表单本身会进行加密并对数据库进行测试。这是AuthenticationForm的{​​{1}}方法的片段,它执行此操作:

clean

您可以看到整个定义here

我想您使用def clean(self): username = self.cleaned_data.get('username') password = self.cleaned_data.get('password') if username and password: self.user_cache = authenticate(username=username, password=password) ... 中的官方make_password函数,但仔细查看文档,通常,用户注册函数会自动执行此操作,因此您无需执行此操作。

反正:

django.contrib,auth致电后检查错误表单是否正在产生,并将您的is_valid代码更改为:

login

希望这有帮助!

答案 1 :(得分:0)

问题编号。 1 - 错误login()

这可能是问题所在:

login(request, form.get_user())

您已经拥有login功能,它恰好是一个视图。我想您要确认用户身份验证(form.is_valid()不会自动执行此操作)。

更多详情请见the documentation of auth module

  

如何在

中记录用户      

如果您有经过身份验证的用户,则要附加到当前用户   会话 - 这是通过login()函数完成的。

     

的登录()

     

要在视图中记录用户,请使用login()。它需要一个HttpRequest   对象和User对象。 login()将用户的ID保存在会话中,   使用Django的会话框架。

     

请注意,匿名会话期间保留的任何数据都会保留在   用户登录后的会话。

     

此示例显示了如何同时使用authenticate()login()

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

问题编号。 2 - 密码错误

正如Paulo所说,AuthenticationForm已经处理了密码哈希。请阅读官方文档以获取示例:

Using the Django authentication system: Authentication in Web requests