在Django中:如何更新当前会话的到期日期?
我有一个用户已经登录了。
我该怎么做才能延长或更新从请求中收到的会话过期时间呢?
提前谢谢你!
3 个回答
2
我觉得设置 SESSION_COOKIE_AGE 是为了这个目的。登录后,系统会自动为你设置一个在这个时间段内有效的cookie。
你还可以通过使用 SESSION_SAVE_EVERY_REQUEST 这个设置,在每次请求时都保存会话cookie。
7
这里有一段中间件代码,用来延长已经登录用户的会话时间。简单来说,如果用户的会话到期时间还剩下不到30天,这段代码会再给他们的会话延长60天,这样他们就可以一直保持登录状态。
custom_middleware.py:
from datetime import timedelta
from django.utils import timezone
EXTENDED_SESSION_DAYS = 60
EXPIRE_THRESHOLD = 30
class ExtendUserSession(object):
"""
Extend authenticated user's sessions so they don't have to log back in
every 2 weeks (set by Django's default `SESSION_COOKIE_AGE` setting).
"""
def process_request(self, request):
# Only extend the session for auth'd users
if request.user.is_authenticated():
now = timezone.now()
# Only extend the session if the current expiry_date is less than 30 days from now
if request.session.get_expiry_date() < now + timedelta(days=EXPIRE_THRESHOLD):
request.session.set_expiry(now + timedelta(days=EXTENDED_SESSION_DAYS))
接下来,你需要把这个自定义的中间件放在Django的SessionMiddleware之后,所以你的设置文件应该像这样:
project/settings.py:
MIDDLEWARE_CLASSES = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'project.custom_middleware.ExtendUserSession',
...
]
9
其实不需要为这个特意写一个自定义的中间件。
只要把 SESSION_SAVE_EVERY_REQUEST = True
这个设置打开,Django 自带的 SessionMiddleware
就会自动做到你想要的效果。
它的代码是这样的:
if modified or settings.SESSION_SAVE_EVERY_REQUEST:
if request.session.get_expire_at_browser_close():
max_age = None
expires = None
else:
max_age = request.session.get_expiry_age()
expires_time = time.time() + max_age
expires = cookie_date(expires_time)
# Save the session data and refresh the client cookie.
# Skip session save for 500 responses, refs #3881.
if response.status_code != 500:
request.session.save()
response.set_cookie(settings.SESSION_COOKIE_NAME,
request.session.session_key, max_age=max_age,
expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
path=settings.SESSION_COOKIE_PATH,
secure=settings.SESSION_COOKIE_SECURE or None,
httponly=settings.SESSION_COOKIE_HTTPONLY or None)