[用例] 我们的 django 应用程序利用 AJAX 并允许多个作者和编辑器查看和编辑一篇文章。
我们的 Django 应用程序具有以下会话管理要求。
- 任何时候只允许 1 个经过身份验证的用户出现在页面上。
- 当用户关闭窗口或退出页面时,会话过期。
- 会话在一段时间不活动后过期
- 如果用户在应用程序上处于活动状态,则会话不得超时。
目前我一直在研究会话模型,但是我还没有看到任何将页面限制为只有 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 调用的解锁视图,并在页面退出时删除锁定(从会话中读取)。会话+缓存是最简单的解决方案,但是很容易将其更改为db版本。