2015-02-06 28 views
1

有沒有一種方法可以跟蹤Django中會話存在的時間長度?如何跟蹤Django中用戶會話的長度

有沒有一種方法可以讓Django在會話過期時運行一個函數?這將允許我這樣做。

謝謝!

+3

最好的辦法是每隔X分鐘運行一次芹菜任務,檢查會話數據庫以查看哪些會話已過期。你可以使用['user_logged_out'](https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.django.contrib.auth.signals.user_logged_out)信號,但這很明顯僅當用戶通過註銷手動過期時才能工作,但對於因不活動而過期的會話不起作用 – 2015-02-06 19:46:22

+0

@ TimmyO'Mahony謝謝!好主意 – user2662692 2015-02-06 20:21:40

回答

2

正如@ TimmyO'Mahony所提到的,您可以使用user_logged_out信號來處理由於註銷而導致的會話結束。

由於不活動,您可以使用中間件來處理會話過期。中間件可以看起來像:

import time 
from django.contrib.auth import logout 

SESSION_TIMEOUT = 5400 # 90 minutes 

class HandleSessionExpiryMiddleware(object): 
    def process_request(self, request): 
     last_activity = request.session.get('last_activity') 
     now = time.time() 
     idle = now - last_activity if last_activity else 0 

     timeout = SESSION_TIMEOUT 

     if idle > timeout: 
      run_on_expiry() 
      logout(session) 
     else: 
      request.session['last_activity'] = now 
      idle = 0 

    def run_on_expiry(self): 
     # Custom code 

假設上面的代碼是在一個文件sessions/middleware.py,你需要這個中間件在settings.py像添加到MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'sessions.middleware.HandleSessionExpiryMiddleware', 
    ... 
) 

希望這有助於!