【问题标题】:Django session expires at browser close OR after timeDjango 会话在浏览器关闭或一段时间后过期
【发布时间】:2012-12-18 06:10:27
【问题描述】:

Django 文档指出:

可以控制会话框架是否使用浏览器长度 会话与持久会话 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置。

如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True,Django 将使用 浏览器长度的cookies——一旦用户过期,cookies 关闭他或她的浏览器。如果您希望人们必须登录,请使用此选项 在他们每次打开浏览器时。

此设置是全局默认设置,可以随时覆盖 每个会话级别通过显式调用 set_expiry() 方法 request.session 如上所述在视图中使用会话。

所以当我在我的设置文件中将 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True 时,这确实是它的作用。这很好,因为我希望用户的会话在浏览器关闭时过期。但是,我还希望用户的会话在闲置 15 分钟后过期。如果我使用上面提到的 set_expiry() ,则 SESSION_EXPIRE_AT_BROWSER_CLOSE 将被覆盖,因此如果用户在到期前关闭浏览器然后重新打开浏览器,则会话仍然有效。不是我想要的。

此外,set_expiry() 的文档说会话在 inactivity 的设定时间后过期。这实际上不是真的。无论我的用户是否在网站上点击,它都会过期。

所以总结一下,我想做的是:

  1. 已将我的会话配置为如果用户关闭浏览器,会话将自动过期。
  2. 设置随活动更新的会话过期长度,即如果用户在网站上执行其他操作,则过期时间会被重置。

想法/建议?

【问题讨论】:

标签: django session session-cookies


【解决方案1】:

正如 Jiaaro 在 this answer 中建议的那样,您可以使用 SESSION_EXPIRE_AT_BROWSER_CLOSE 并在每次请求时设置会话时间戳,并添加自定义 Middleware 来处理不活动。

【讨论】:

  • 它不适用于 Chrome v23(至少在 Ubuntu 12.04 上)注意Some browsers (Chrome, for example) provide settings that allow users to continue browsing sessions after closing and re-opening the browser. In some cases, this can interfere with the SESSION_EXPIRE_AT_BROWSER_CLOSE setting ... 来源:browser-length-sessions-vs-persistent-sessions
  • 我可能错了,但是一些阅读表明在浏览器关闭时过期并不等于在窗口关闭时过期
【解决方案2】:

来自文档https://docs.djangoproject.com/en/1.8/topics/http/sessions/#browser-length-sessions-vs-persistent-sessions

某些浏览器(例如 Chrome)提供的设置允许用户在关闭并重新打开浏览器后继续浏览会话。在某些情况下,这可能会干扰 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置并防止会话在浏览器关闭时过期。请在测试启用了 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置的 Django 应用程序时注意这一点。

【讨论】:

    【解决方案3】:

    当用户关闭浏览器时会话过期:

    通过将 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True 来实现此要求。

    Reference

    会话在一段时间不活动后过期:

    SESSION_COOKIE_AGE 是会话 cookie 的使用时间,以秒为单位。
    默认值:1209600(2 周,以秒为单位)

    Reference

    您应该在 setting/__init__.py 上设置这些选项

    【讨论】:

      【解决方案4】:

      搜索引擎缓存确保会话将在 TOGETHERSESSION_EXPIRE_AT_BROWSER_CLOSE = TRUE

      时关闭
      SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
      

      【讨论】:

        【解决方案5】:

        默认情况下,SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False,这意味着会话 cookie 将在用户的浏览器中存储 SESSION_COOKIE_AGE。如果您不希望人们每次打开浏览器时都必须登录,请使用此选项。

        如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True,Django 将使用浏览器长度的 cookie——一旦用户关闭浏览器,cookie 就会过期。如果您希望人们每次打开浏览器时都必须登录,请使用此选项。

        【讨论】:

          猜你喜欢
          • 2011-04-16
          • 2015-11-07
          • 1970-01-01
          • 1970-01-01
          • 2011-04-21
          • 2015-08-12
          • 2013-11-17
          • 1970-01-01
          • 2018-04-27
          相关资源
          最近更新 更多