将网页限制为每页1个会话Django

时间:2013-06-24 07:00:37

标签: python django session

[用例] 我们的django应用程序使用AJAX,允许多个编写者和编辑者查看和编辑单篇文章。

我们的Django应用程序具有以下会话管理要求。

  1. 任何时候,页面上只允许1个经过身份验证的用户。
  2. 当用户关闭窗口或退出页面时,会话过期。
  3. 会话在一段时间不活动后过期
  4. 如果用户在应用中处于有效状态,则会话不得超时。
  5. 目前我一直在调查会话模型,但是我没有看到任何解决方案将页面限制为只有1个用户。

    谢谢!

1 个答案:

答案 0 :(得分: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调用的解除阻止视图,并在页面退出时删除锁定(从会话中读取)。会话+缓存是最简单的解决方案,但很容易将其更改为db版本。

相关问题