2013-09-26 108 views
0

我有以下要求:如何處理Django的會話正確

  1. 用戶必須能夠看到(和註銷)的其他會議。
  2. 會議必須在瀏覽器關閉和閒置的perioid後到期BOTH
  3. default數據庫不能用於存儲會話。

我目前的做法是設置SESSION_EXPIRE_AT_BROWSER_CLOSE並添加middleware類檢查last_activity /和更新的時間戳(或稱logout()如果會話已過期),並運行在非活動會話定期清理。

但是,我找不到在請求之外訪問非數據庫支持的會話的方法(或者訪問請求內部除當前會話之外的其他任何方法) 此外,我找不到任何文檔如何將django_session表存儲到另一個數據庫。

我目前使用使用基於文件的高速緩存支持會話,但可以改變 - 唯一的要求是不會話存儲在數據庫default

回答

1

1)對於此找到當前用戶的所有會話 - request.user - 你將不得不通過所有會話對象進行迭代譯碼數據,並檢查用戶ID。不是非常優化。例如:

可能是您可以優化以迭代未過期的會話。

for s in Session.objects.all(): 
    data = s.get_decoded() 
    if data['_auth_user_id'] == request.user.id: 
     # you got session for current user 

2)爲此,您需要在自定義中間件中操作會話過期數據,如上所述。

3)要在不同的數據庫存儲會話,你需要添加database router

喜歡的東西:

class SessionRouter(object): 
    """ 
    A router to control all database operations 
    sessions. 
    """ 
    def db_for_read(self, model, **hints): 

     if model == Session or model == SessionStore 
      return 'session_db' 
     return None 
     #similar more methods 

,並在設定

DATABASES = { 
    'session_db': { 
     #settings for session db 
    }, 
    #any other databases. 
+0

看來,寫的東西做什麼,我需要和使用的,而不是會議這似乎是最可行的選擇 - '〜/混帳/ django/django/contrib/sessions $ find。 -name'* .py'| xargs cat | wc -l'說'1600' ... – Kimvais

+0

@Kimvais,你可以編寫自己的中間件。但是我認爲,根據用戶的行動,你需要在某種意義上做到這一點。 – Rohan

+0

當然可以。 – Kimvais