2013-02-26 84 views
30

如何在登錄頁面選中「記住我」選項來重複使用原始admin login()和AuthenticationForm爲用戶設置更長的cookie長度?我目前使用內置的登錄通過urls.py使用內置登錄視圖和身份驗證表單的Django「Remember Me」

url(r'^login/$','django.contrib.auth.views.login', {'template_name': 'authentication/login.html'}, name='login'), 

複選框在我的login.html實現爲:

<label><input name="remember_me" type="checkbox">Keep me logged in</label> 

,但我不知道如何通過傳遞信息AuthenticationForm到django.contrib.auth.views.login

目前,如果用戶登錄「記住我」複選框選中,餅乾年齡在settings.py

SESSION_COOKIE_AGE = 360 
01定義

我發現了幾個類似的問題,但我不認爲這應該需要安裝一個單獨的應用程序。以下代碼段(http://djangosnippets.org/snippets/1881/)似乎很有前途,但我只爲幾個月的編碼Python和Django和我是不是能夠得到它的工作:

def login(request, *args, **kwargs): 
    if request.method == 'POST': 
     if not request.POST.get('remember_me', None): 
      request.session.set_expiry(0) 
    return auth_views.login(request, *args, **kwargs) 
+0

該片段實際上是以另一種方式工作,但主要想法仍然是基於複選框選擇設置cookie過期。 – Sawwy 2013-02-26 22:26:38

+0

這段代碼是正確的,只需將'SESSION_COOKIE_AGE'設置爲記住的登錄期滿,'request.session.set_expiry(0)'內的'0'設置爲一次性登錄失效。 – okm 2013-02-26 22:57:05

+0

好吧,我現在以默認會話長度爲5秒的方式工作,記住我的會話時間爲30秒(僅用於測試目的)。但是,當我使用set_expiry(0)時,關閉瀏覽器時不會刪除會話(關閉整個瀏覽器而不是選項卡)。問題依然存在:1)刪除FROM django_session(刪除數據庫中的所有會話信息)2)清除所有瀏覽器歷史記錄(Chrome 25.0.1364.97)。我從頭開始,但一旦這是用戶登錄,它將保持登錄。有什麼我需要做的? – Sawwy 2013-02-27 09:49:29

回答

14

Django的會話cookie年齡在seconds定義。

SESSION_COOKIE_AGE = 360 

表示會話將在6分鐘後過期。我最近實施的「記住我」功能,我設置如下:

SESSION_COOKIE_AGE = 60 * 60 * 24 * 30 # One month 

登錄視圖需要重寫爲您在片段所示。

但是,聽起來像關閉瀏覽器時有一個奇怪的問題(當記住我沒有選中時)不需要用戶重新登錄,如果使用set_expiry(0),則不應該發生這種情況。當您使用set_expiry(0)時,django會設置一個'會話'長度cookie,而不是固定長度的cookie,並且設計它會在瀏覽器關閉後過期。

還有另一些設置會影響瀏覽器關閉的清除cookie。也許你可以嘗試更改SESSION_EXPIRE_AT_BROWSER_CLOSE設置的值或檢查它在配置中的現有值。 https://docs.djangoproject.com/en/1.10/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions