2013-06-24 35 views
0

[用例] 我們的django應用程序利用AJAX,並允許多個編寫者和編輯器查看和編輯單篇文章。限制網頁每頁1個會話Django

我們的Django應用程序具有以下會話管理要求。

  1. 只允許1個身份驗證的用戶在任何一次的頁面上。
  2. 當用戶關閉窗口或退出頁面時,會話過期。在閒置一段時間
  3. 如果用戶是在應用程式的有效後
  4. 會話過期,會話不能超時。

目前我一直在尋找會話模型,但我還沒有看到任何解決方案將頁面限制爲只有1個用戶。

謝謝!

+0

概念上:當您有1個用戶時,將全局布爾值設置爲True,當您有0個用戶時,將其設置爲false。如果爲True,則用戶無法登錄。 –

+0

謝謝!偉大的投入。 但是我對使用django信號擴展用戶會話的能力存在一些疑問(如果用戶點擊yes,擴展會話,則從jquery調用擴展會話)。 – laycat

+0

您不必擴展會話,它會在用戶執行活動時「自動」擴展。閱讀此:https://docs.djangoproject.com/en/dev/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions –

回答

2

阻斷裝飾:

def view_only_by_one(key_function=lambda request: sha256(request.path).hexdigest()): 
    def __dec(the_view): 
     def __inner(request, *args, **kwargs):     
      key_for_view = key_function(request) 
      current_blocked = request.session.get('blocked_view'): 
      if current_blocked and current_blocked != key_for_view: 
       cache.set(key, None, timeout=0) 
      user_id = cache.get(key_for_view) 
      if user_id and user_id != request.user.id: 
       raise PermissionDenied() 
      cache.set(key, request.user.id, timeout=settings.ONLY_BY_ONE_BLOCK_TIME) 
      request.session['blocked_view'] = key_for_view 
      return the_view(request, *args, **kwargs) 
     return __inner 
    return __dec 

此外,您可以通過AJAX稱爲解鎖視圖,並刪除鎖定(從進程中讀取)在退出頁面。 Session + cache是​​最簡單的解決方案,但很容易將其更改爲db版本。

+0

哇.. 1秒閱讀本文http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python來趕上你的代碼。 – laycat

+0

我犯了錯誤,現在是固定的。 view_only_by_one函數產生裝飾器,用法:@view_only_by_one()\ ndef my_view(請求):... – dswistowski

+0

我在哪裏可以把這個裝飾器? – laycat