从django的文档来看,我的印象是:
request.session.set_expiry(300)
从一个视图会导致会话在五分钟不活动后到期;然而,这不是我在django trunk中遇到的行为。如果我从一个视图调用此方法,并浏览到不调用该方法的其他视图,则会话将在五分钟后到期。我期待的行为仅在五分钟不活动后才过期,并且在到期之前不会再次调用set_expiry。
我的问题是,我真的需要在每个视图中调用set_expiry吗?如果是这样,是否存在一些可能有帮助的装饰器?我无法想象这不是贡献的一部分。
谢谢, 皮特
答案 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
默认将此设置考虑在内,那就太好了。