2013-04-20 52 views
7

具体来说,在认证和重定向之后,request.user是匿名用户。Django:重定向后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() 
+1

添加您的整个视图逻辑,有没有办法告诉你的形式和登录方法是什么样子从片段您已发布。 – 2013-04-20 10:39:21

+0

在验证用户身份后'request.user.is_authenticated()'在登录视图中返回TRUE吗? – Rohan 2013-04-20 11:01:48

+1

您可以在我们的pastebin.com代码片段中与我们分享您的表单和登录视图吗?谢谢。 – 2013-04-20 11:33:16

回答

0

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

-1

这是修复

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

此文件是从静态目录中缺少。由此产生的404正在打破用户会话。

3

很多事情不应该在这里进行。首先,只要您使用的是RequestContext,您无需通过request.user,该默认值可用。

Login()这个方法,究竟是干什么的? Django提供了一个built-in login method,如果您使用默认身份验证后端,您应该使用它。

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

这里是一个不同版本的代码,改编自example in the documentation

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)