Django会话到期了吗?

时间:2009-09-02 06:42:14

标签: python django

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

request.session.set_expiry(300)

从一个视图会导致会话在五分钟不活动后到期;然而,这不是我在django trunk中遇到的行为。如果我从一个视图调用此方法,并浏览到不调用该方法的其他视图,则会话将在五分钟后到期。我期待的行为仅在五分钟不活动后才过期,并且在到期之前不会再次调用set_expiry。

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

谢谢, 皮特

2 个答案:

答案 0 :(得分:27)

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

您可以使用SESSION_SAVE_EVERY_REQUEST设置来获取您所追求的行为(显而易见的是会话必须保存每个请求)。

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

答案 1 :(得分:3)

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

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默认将此设置考虑在内,那就太好了。