如何查看Django中剩余的会话过期时间?
如何查看Django会话的剩余过期时间
问题原因解析
你当前的调用结果不符合预期,核心原因有两点:
set_expiry(60)设置的是会话的绝对过期时长(从会话最后一次活跃时间算起),但你在视图中刚设置就休眠时,会话还未被保存到后端存储(数据库/缓存),get_expiry_age()只会返回你设置的初始值60,而非剩余时间。get_session_cookie_age()返回的是Django配置中SESSION_COOKIE_AGE的默认值(默认1209600秒,即2周),和你手动设置的会话过期规则无关。
可行解决方案
方案1:手动记录过期时间戳
在设置会话过期时,同步将过期时间戳存入会话,后续通过当前时间与该时间戳的差值计算剩余时间:
# views.py from django.shortcuts import render import time from datetime import datetime, timedelta def test(request): expiry_seconds = 60 request.session.set_expiry(expiry_seconds) # 记录会话的过期时间戳(当前时间+过期时长) request.session['expires_at'] = (datetime.now() + timedelta(seconds=expiry_seconds)).timestamp() time.sleep(20) # 计算剩余时间(确保不出现负数) now = datetime.now().timestamp() remaining_seconds = request.session.get('expires_at', 0) - now print(max(0, int(remaining_seconds))) # 输出约40 return render(request, 'test/index.html')
注意:Django会在视图结束时自动保存会话,若需在视图中提前获取正确值,可手动调用
request.session.save()。
方案2:从后端存储直接查询
若你的会话存储在数据库或缓存中,可直接查询存储的会话数据获取过期时间:
- 数据库存储场景(
SESSION_ENGINE = 'django.contrib.sessions.backends.db'):
from django.shortcuts import render import time from django.contrib.sessions.models import Session from datetime import datetime def test(request): expiry_seconds = 60 request.session.set_expiry(expiry_seconds) request.session.save() # 手动保存会话到数据库 time.sleep(20) # 查询会话对象并计算剩余时间 session_obj = Session.objects.get(session_key=request.session.session_key) expire_date = session_obj.expire_date remaining_seconds = (expire_date - datetime.now(expire_date.tzinfo)).total_seconds() print(max(0, int(remaining_seconds))) # 输出约40 return render(request, 'test/index.html')
- 缓存存储场景:根据会话键从缓存中取出会话数据,解析其中的
_session_expiry字段计算剩余时间(不同缓存后端的实现略有差异)。
关键补充说明
当会话已被保存到后端存储后,get_expiry_age()会基于当前时间和会话过期时间自动计算剩余时长,但前提是会话设置的是**临时过期(秒数)**而非固定过期日期。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

