【问题标题】:Limit web page to 1 session per page Django将网页限制为每页 1 个会话 Django
【发布时间】:2013-06-24 07:00:36
【问题描述】:

[用例] 我们的 django 应用程序利用 AJAX 并允许多个作者和编辑查看和编辑一篇文章。

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

  1. 在任何时候只允许 1 个经过身份验证的用户在页面上。
  2. 当用户关闭窗口或退出页面时会话过期。
  3. 会话在一段时间不活动后过期
  4. 如果用户在应用上处于活动状态,则会话不得超时。

目前我一直在研究会话模型,但是我没有看到任何解决方案将页面限制为只有 1 个用户。

谢谢!

【问题讨论】:

  • 从概念上讲:当你有 1 个用户时将全局布尔值设置为 True,当你有 0 个用户时设置为 false。如果为 True,则用户无法登录。
  • 谢谢!很好的输入。但是,我对使用 django 信号扩展用户会话的能力有些怀疑(如果用户单击是,则从 jquery 调用扩展会话,扩展会话)。
  • 您不必扩展会话,它会在用户执行活动时“自动”扩展。阅读:docs.djangoproject.com/en/dev/topics/http/sessions/…

标签: python django session


【解决方案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 + 缓存是最简单的方案,但是改成db版本也很简单。

【讨论】:

  • 哇.. 1 秒阅读此stackoverflow.com/questions/739654/… 以立即了解您的代码。
  • 我犯了错误,现在已修复。 view_only_by_one 函数产生装饰器,用法:@view_only_by_one()\ndef my_view(request): ...
  • 我会把这个装饰器放在哪里??
猜你喜欢
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2015-02-15
  • 2020-05-09
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多