Django 会话过期?

新手上路,请多包涵

从 django 的文档中,我的印象是调用:

 request.session.set_expiry(300)

从一种观点来看,会导致会话在五分钟 不活动 后过期;但是,这不是我在 django trunk 中遇到的行为。如果我从一个视图调用此方法,然后浏览到其他未调用该方法的视图,会话将在五分钟后过期。我期望的行为是仅在五分钟不活动后才过期,而不仅仅是在过期前再次调用 set_expiry 失败。

那么我的问题是我真的需要在每个视图中调用 set_expiry 吗?如果是这样,是否存在一些可能有帮助的装饰器?我无法想象这不是 contrib 的一部分。

谢谢,皮特

原文由 slypete 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 930
2 个回答

作为这些方法的作者,我可以看到文档对此不是很清楚。您的观察是正确的:只有导致会话被更改的请求才被视为“活动”。

您可以使用 SESSION_SAVE_EVERY_REQUEST 设置来获得您想要的行为(明显的代价是每次请求都必须保存会话)。

注意:它将使用最新的到期日期更新现有会话记录。

原文由 SmileyChris 发布,翻译遵循 CC BY-SA 4.0 许可协议

一个简单的中间件可能会比在每个视图中设置它更好。这是我用的。

 class SessionExpiry(object):
    """ Set the session expiry according to settings """
    def process_request(self, request):
        if getattr(settings, 'SESSION_EXPIRY', None):
            request.session.set_expiry(settings.SESSION_EXPIRY)
        return None

这取决于 SESSION_EXPIRY 在您的配置中设置。它的格式与 request.session.set_expiry 相同。

MIDDLEWARE_CLASSES 定义时应牢记以下顺序:

 MIDDLEWARE_CLASSES = (
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    '<yourproject>.<yourapp>.middleware.SessionExpiry',
    ...
}

如果 django.contrib.sessions 默认考虑这个设置就好了。

原文由 Mike Shultz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题