2011-06-14 331 views
7

我正在使用django.contrib.auth用戶管理系統。爲什麼我無法註銷django用戶身份驗證?

所以我就註冊/插入到用戶表/模型,並將其從django.contrib.auth.views.login,這樣我就可以登錄登錄。

但是,我不能使用Django .contrib.auth.views.logout註銷

我有我的模板

<h1>My Account</h1> 
<strong> Welcome, {{ name|capfirst }}!</strong> 
<br /><br /> 
<ul> 
    <li> 
     {% if user.is_authenticated %} 
      <a href="{% url django.contrib.auth.views.logout %}">Logout</a> 
     {% else %} 
      <a href="{% url register %}">Sign Up</a> 
    </li> 
    <li> 
      <a href="{% url django.contrib.auth.views.login %}">Login</a> 
     {% endif %} 
    </li> 
</ul> 

不過,我總是得到的名稱和註銷鏈接,因爲我從來沒有真正當我點擊退出按鈕退出

這是我爲這個urls.py部分:

urlpatterns += patterns('django.contrib.auth.views', 
    url(r'^login/$', 'login', { 'template_name': 'registration/login.html', 'SSL': settings.ENABLE_SSL }, 'login'), 
    url(r'^my_account/$', 'logout', { 'template_name': 'registration/my_account.html', 'SSL': settings.ENABLE_SSL }, 'logout'), 
) 

我在做什麼錯? 注:我也是通過的Apache2運行Django與mod_wsgi的

謝謝!

新增信息:

不知道這是否幫助,但我在HTML印刷request.session.items並得到

[('_auth_user_backend', 'django.contrib.auth.backends.ModelBackend'), ('_auth_user_id', 9L)] 

當我登錄了,也經過我點擊退出按鈕( django.contrib.auth.views.logout)

而且,我創建:

from django.contrib.auth import logout 
def logout_view(request): 
    request.session.items = [] 
    request.session.modified = True 
    logout(request) 

和鏈接,爲第二註銷鏈接/按鈕,我沒有註銷和request.session.items保持不變如上點擊鏈接

我覺得我在收盤後:

在我的看法功能之一我所做的:

request.session["fav_color"] = "blue" 
request.session.modified = True 

,然後在HTML打印{{request.session.items}}這給了我

[('_auth_user_backend', 'django.contrib.auth.backends.ModelBackend'), ('_auth_user_id', 9L)] 

,並沒有( 'fav_color', '藍')元組。我又做錯了什麼,還是證明我的request.session列表沒有被修改?

ķ想通了:

url(r'^my_account/$', 'logout', { 'template_name': 'registration/my_account.html', 'SSL': settings.ENABLE_SSL }, 'logout'), 

應該

url(r'^logout/$', 'logout', { 'template_name': 'registration/my_account.html', 'SSL': settings.ENABLE_SSL }, 'logout'), 
+0

這看起來對我來說是正確的。您可能想要安裝django調試工具欄,並查看它說的用戶對象是什麼。這可以幫助您確定用戶變量是否正確等。 – Hutch 2011-06-14 20:05:22

+0

添加了一些額外的信息,也許這可能有助於確定問題是什麼? – Derek 2011-06-14 20:24:40

回答

2

我認爲urls.py會是這樣的(login and logout views do not accept SSL parameter):

from django.core.urlresolvers import reverse 
urlpatterns += patterns('django.contrib.auth.views', 
     url(r'^login/$', 'login', { 'template_name': 'registration/login.html'}, name='login'), 
     url(r'^logout/$', 'logout', { 'template_name': 'registration/my_account.html', 'next_page':reverse('index') }, name='logout'), 
) 

而且在模板:

<h1>My Account</h1> 
<strong> Welcome, {{ name|capfirst }}!</strong> 
<br /><br /> 
<ul> 
    <li> 
     {% if user.is_authenticated %} 
      <a href="{% url logout %}">Logout</a> 
     {% else %} 
      <a href="{% url register %}">Sign Up</a> 
    </li> 
    <li> 
      <a href="{% url login %}">Login</a> 
     {% endif %} 
    </li> 
</ul> 
2

您需要使用網址指向該視圖註銷視圖。沒有什麼必須在模板上,只需在該註銷視圖中使用django.contrib.auth.logout()。在新的django服務器上,您可以進行eaisly註銷,但您需要在視圖中執行此操作,而不是模板。下面是來自Django的一本書的摘錄:

這個例子說明了如何將一個視圖函數中使用這兩種身份驗證()和login():

from django.contrib import auth 

def login_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username=username, password=password) 
    if user is not None and user.is_active: 
     # Correct password, and the user is marked "active" 
     auth.login(request, user) 
     # Redirect to a success page. 
     return HttpResponseRedirect("/account/loggedin/") 
    else: 
     # Show an error page 
     return HttpResponseRedirect("/account/invalid/") 

要註銷用戶,請使用django.contrib中.auth.logout()在您的視圖中。它帶有一個HttpRequest對象,並沒有返回值:

from django.contrib import auth 

def logout_view(request): 
    auth.logout(request) 
    # Redirect to a success page. 
    return HttpResponseRedirect("/account/loggedout/") 

參考Django的書都http://www.djangobook.com/en/2.0/chapter14/方面,我從這本書裏學到的一切。

1

我遇到過這個問題,這是一個愚蠢的頭痛。這是我強制登出的方式。我保存logout(request)(希望)觸發用戶退出信號:

def logout_view(request): 

    logout(request) 
    request.session.flush() 
    request.user = AnonymousUser 

    return HttpResponseRedirect('accounts/loggedout/')