[用例] 我們的django應用程序利用AJAX,並允許多個編寫者和編輯器查看和編輯單篇文章。限制網頁每頁1個會話Django
我們的Django應用程序具有以下會話管理要求。
- 只允許1個身份驗證的用戶在任何一次的頁面上。
- 當用戶關閉窗口或退出頁面時,會話過期。在閒置一段時間
- 如果用戶是在應用程式的有效後
- 會話過期,會話不能超時。
目前我一直在尋找會話模型,但我還沒有看到任何解決方案將頁面限制爲只有1個用戶。
謝謝!
[用例] 我們的django應用程序利用AJAX,並允許多個編寫者和編輯器查看和編輯單篇文章。限制網頁每頁1個會話Django
我們的Django應用程序具有以下會話管理要求。
目前我一直在尋找會話模型,但我還沒有看到任何解決方案將頁面限制爲只有1個用戶。
謝謝!
阻斷裝飾:
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版本。
哇.. 1秒閱讀本文http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python來趕上你的代碼。 – laycat
我犯了錯誤,現在是固定的。 view_only_by_one函數產生裝飾器,用法:@view_only_by_one()\ ndef my_view(請求):... – dswistowski
我在哪裏可以把這個裝飾器? – laycat
概念上:當您有1個用戶時,將全局布爾值設置爲True,當您有0個用戶時,將其設置爲false。如果爲True,則用戶無法登錄。 –
謝謝!偉大的投入。 但是我對使用django信號擴展用戶會話的能力存在一些疑問(如果用戶點擊yes,擴展會話,則從jquery調用擴展會話)。 – laycat
您不必擴展會話,它會在用戶執行活動時「自動」擴展。閱讀此:https://docs.djangoproject.com/en/dev/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions –