2010-06-15 86 views

回答

2

設置SESSION_COOKIE_AGE是我爲此設計的。在此期間登錄後cookie自動設置。

您還可以使用SESSION_SAVE_EVERY_REQUEST設置在每個請求上保存會話Cookie。

+0

是啊..但如果用戶的會話即將到期,我想進一步延長他的會話的失效日期,那麼有沒有辦法? – Nullpoet 2010-06-15 12:23:47

+0

瞭解它:) request.session.set_expiry()工作! – Nullpoet 2010-06-15 12:54:46

+0

好吧,現在我明白了:)好,你解決了這個問題。 – dzida 2010-06-15 14:03:54

4

這是一些擴展認證用戶會話的中間件。如果他們的會話expiry_date距離不到30天,它基本上可以通過延長會話的60天來讓他們永久登錄。

custom_middleware.py:

from datetime import timedelta 

from django.utils import timezone 


EXTENDED_SESSION_DAYS = 60 
EXPIRE_THRESHOLD = 30 
class ExtendUserSession(object): 
    """ 
    Extend authenticated user's sessions so they don't have to log back in 
    every 2 weeks (set by Django's default `SESSION_COOKIE_AGE` setting). 
    """ 
    def process_request(self, request): 
     # Only extend the session for auth'd users 
     if request.user.is_authenticated(): 
      now = timezone.now() 

      # Only extend the session if the current expiry_date is less than 30 days from now 
      if request.session.get_expiry_date() < now + timedelta(days=EXPIRE_THRESHOLD): 
       request.session.set_expiry(now + timedelta(days=EXTENDED_SESSION_DAYS)) 

然後,您將需要經過 Django的SessionMiddleware添加這個定製中間件,因此您的設置文件應該是這樣:

項目/ settings.py :

MIDDLEWARE_CLASSES = [ 
    ... 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'project.custom_middleware.ExtendUserSession', 
    ... 
] 
+0

這是否*絕對*廣告作品? 'get_expiry_date'的[docs](https://docs.djangoproject.com/zh/1.10/topics/http/sessions/#django.contrib.sessions.backends.base.SessionBase.get_expiry_date)表示「這將等於從**現在**「(重點是我的)日期'SESSION_COOKIE_AGE'秒,這與我的本地測試一致。 – 2017-03-30 21:54:48

2

不需要爲此創建自定義中間件。

設置SESSION_SAVE_EVERY_REQUEST = True將導致Django的現有SessionMiddleware做你想要的。

它有這樣的代碼:

if modified or settings.SESSION_SAVE_EVERY_REQUEST: 
    if request.session.get_expire_at_browser_close(): 
     max_age = None 
     expires = None 
    else: 
     max_age = request.session.get_expiry_age() 
     expires_time = time.time() + max_age 
     expires = cookie_date(expires_time) 
    # Save the session data and refresh the client cookie. 
    # Skip session save for 500 responses, refs #3881. 
    if response.status_code != 500: 
     request.session.save() 
     response.set_cookie(settings.SESSION_COOKIE_NAME, 
       request.session.session_key, max_age=max_age, 
       expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, 
       path=settings.SESSION_COOKIE_PATH, 
       secure=settings.SESSION_COOKIE_SECURE or None, 
       httponly=settings.SESSION_COOKIE_HTTPONLY or None) 
+1

這絕對是這樣做的正確方法。 – Risadinha 2017-09-06 13:47:19