2013-04-20 39 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)