Django:重定向后没有设置request.user

时间:2013-04-20 10:15:46

标签: django authentication

具体来说,在身份验证和重定向之后,request.user是一个匿名用户。

登录(查看功能)

def login(request):
if request.method == 'POST':

    form = LoginForm(request.POST) 

    if form.is_valid():
        #django.contrib.auth.login
        Login(request, form.get_user())
        str = reverse('cm_base.views.index')
        return HttpResponseRedirect(str)
    else:
            # Their password / email combination must have been incorrect
        pass

else:
    form = LoginForm()

return render_to_response('cm_base/login.html', 
                          {"DEBUG": True,
                           'form' : form
                           },
                          context_instance=RequestContext(request))

在索引视图中,我删除了login_required装饰器并测试了request.user对象

def index(request):
test = request.user.is_authenticated()

return render_to_response('cm_base/index.html', 
                          {"DEBUG": True,
                           "user": request.user,},
                          context_instance=RequestContext(request))

测试返回false。

修正

我最后只是直接调用索引视图。当我调用HttpResponseRedirect时,我仍然对用户对象丢失的原因感到困惑。

def login(request):
if request.method == 'POST':
    form = LoginForm(request.POST) # Not shown in this example

    if form.is_valid():
        Login(request, form.get_user())
        str = reverse('cm_base.views.index')
        return index(request)
    else:
            # Their password / email combination must have been incorrect
        pass

else:
    form = LoginForm()

3 个答案:

答案 0 :(得分:3)

这里发生的很多事情都不应该。首先,您不需要传递request.user,只要您使用的是RequestContext,就可以使用Login()

from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login def login_view(request): form = LoginForm(request.POST or {}) ctx = {'form': form} if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] user = authenticate(username, password) if not user: ctx['errors'] = 'Invalid Login' return render(request, 'login.html', ctx) if not user.is_active: ctx['errors'] = 'User is locked' return render(request, 'login.html', ctx) login(request, user) return redirect('home') else: return render(request, 'login.html', ctx) 这种方法究竟是做什么的?如果您使用默认的身份验证后端,Django会提供您应该使用的built-in login method

您也没有检查用户是启用还是禁用。

以下是您的代码的不同版本,改编自example in the documentation

{{1}}

答案 1 :(得分:0)

您使用的是什么身份验证后端?如果它不是ModelBackend,请确保你的get_user方法是正确的。听起来好像auth中间件正在发送一个不同的标识符(比如pk而不是用户名),而不是你在get_user方法中寻找的标识符。

答案 2 :(得分:-1)

这是修复

<link rel="icon" href="{{ STATIC_URL }}img/favicon.ico" />

静态目录中缺少此文件。结果404打破了用户会话。