1

在被迫离开 PHP 并使用 Python 和 Django 工作之后,我遇到了一个小问题。

我想要做的是使用 Django 附带的内置用户身份验证。问题是,当我尝试使用“login()”函数时,它不会将用户保存在会话中,或者应该保存在任何地方。

我的代码如下所示:

@csrf_exempt    
def dologin(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.
            return render_to_response('bsys/profile.html', {'message': 'Success!', 'user': request.user.get_full_name()})
        else:
            # Return a 'disabled account' error message
            return render_to_response('bsys/login.html', {'message': 'Disabled!'})
    else:
        # Return an 'invalid login' error message.
        return render_to_response('bsys/login.html', {'message': 'Sumthin Wong!'})

所以问题是当我运行时:

request.user.get_full_name()

它说:

Exception Type: AttributeError   
Exception Value: 'AnonymousUser' object has no attribute 'get_full_name'

所以显然它没有登录用户。

当我做同样的事情,但使用:

user.get_full_name()

它可以工作,然后验证功能显然也可以正常工作。所以我猜想是关于 login() 的。

我还尝试过以管理员身份通过 admin-login 登录,然后从另一个视图使用相同的 request.user.get_full_name() ,它工作正常。

有什么想法可以解决这个问题吗?也许我只是错过了框架的一些重要部分。

4

2 回答 2

0

为什么要在成功登录时呈现模板?与所有 POST 的 HTTP 请求一样,最好在成功时重定向以减少用户重新提交请求的机会。

更相关的是,我相信这将解决您的问题,因为模板在使用上下文处理器填充其上下文时auth,会将其{{ user }}变量设置为 的值request.user,这是请求开始时的匿名用户。如果您重定向,新请求将具有 non-anonymous request.user,因此应正确填充模板的值。

于 2012-09-27T17:10:59.970 回答
0

我认为您检查用户是否登录的方式导致了这种情况。

代替:

if user is not None:

尝试:

if user.is_authenticated:

这是它将绕过 AnonymousUser 案例。

(可能是,不记得从我的头顶)

if user.is_authenticated():
于 2012-09-27T16:44:22.303 回答