【发布时间】:2021-02-04 13:08:13
【问题描述】:
在标记为 dup 之前(我相信很多答案都不正确): 根据我的研究:
-
request.session.get_expiry_age返回 cookie 的总寿命,而不是从现在到过期的时间。它总是返回相同的值,而不管剩下多少时间。 - 类似地
get_expiry_date将总寿命添加到现在时间。调用时它总是增加。 因此,它们都没有帮助。
settings.SESSION_SAVE_EVERY_REQUEST 刷新每个请求的 cookie,这不是我想要实现的。
get_session_cookie_age() 仅返回 settings.SESSION_COOKIE_AGE 的值,如源代码所示:
def get_session_cookie_age(self):
return settings.SESSION_COOKIE_AGE
我使用cached_db 会话后端。缓存部分无效,因为它必须每次都保存 cookie,因此 SESSION_SAVE_EVERY_REQUEST 不适用。我问这个问题的原因是因为我希望仅在剩余时间低于阈值时才刷新 cookie,因此会有一些歇斯底里(具有缓存和自动刷新的好处)。
由于get_expiry_age/get_expiry_date 的行为如上所述,我的代码无法正常工作:
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
class SessionExpiry(MiddlewareMixin):
def process_request(self, request):
"""Automatically refresh a session expirary at a certain limit.
If request.session age goes below settings.SESSION_REFRESH, then
set the sessions expirary age to settings.SESSION_COOKIE_AGE. The
session is not refreshed every time to have the caching benefits of
the cached_db backend.
"""
try:
empty = request.session.is_empty()
except AttributeError:
return None
if (empty or not getattr(settings, 'SESSION_REFRESH', None)):
return None
if request.session.get_expiry_age() < settings.SESSION_REFRESH:
request.session.set_expiry(settings.SESSION_COOKIE_AGE)
return None
【问题讨论】:
标签: django session cookies session-cookies