Django会话到期?

2024-04-28 10:51:26 发布

您现在位置:Python中文网/ 问答频道 /正文

从django的文档来看,我的印象是:

request.session.set_expiry(300)

从一个角度来看,这会导致会话在5分钟后过期;但是,这不是我在django trunk中遇到的行为。如果我从一个视图调用此方法,并浏览到其他不调用此方法的视图,则会话将在5分钟后过期。我所期望的行为是在5分钟不活动后才过期,而不是在过期前再次调用set_expiry。

我的问题是我真的需要在每个视图中调用set_expiry吗?如果是的话,是否有一些可能有帮助的装潢师?我无法想象这不是设计的一部分。

谢谢, 皮特


Tags: django方法文档视图requestsession角度trunk
2条回答

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

您可以使用^{}设置来获得您所追求的行为(这显然会导致会话必须保存每个请求)。

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

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

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默认情况下考虑到这个设置,那就太好了。

相关问题 更多 >