Django Session过期续期:如何实现无活动自动过期及访问时续期
Django Session 自动过期与续期实现方案
嘿,我之前刚好处理过一模一样的需求,这就给你拆解一下具体的实现步骤,完全不需要找复杂的第三方库,用Django自带的机制就能搞定:
核心思路
Django本身的Session机制支持设置有效期,但默认只有在修改Session数据时才会自动续期。我们要实现的是:
- 设定一个最长无活动过期时长(比如15天)
- 用户每次访问网站(哪怕只是浏览,没修改数据),都自动把Session的过期时间刷新成「当前时间+15天」
具体实现步骤
1. 配置基础Session过期时长
首先在项目的settings.py里设置Session的默认最长有效期,这里我们设为15天:
# settings.py # 15天的秒数计算:15*24小时*60分钟*60秒 SESSION_COOKIE_AGE = 15 * 24 * 60 * 60 # 确保SESSION_EXPIRE_AT_BROWSER_CLOSE设为False,避免关闭浏览器就失效 SESSION_EXPIRE_AT_BROWSER_CLOSE = False
2. 编写中间件实现自动续期
因为每次用户请求都要触发续期操作,中间件是最合适的切入点。在你的任意一个App下新建middleware.py文件,写入以下代码:
# your_app/middleware.py class SessionExpiryMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 仅对已登录用户处理(如果不需要区分登录状态,可以去掉这个判断) if request.user.is_authenticated: # 刷新Session过期时间:将其重置为当前时间 + SESSION_COOKIE_AGE设定的时长 # get_expiry_age()会返回当前剩余的有效期,用它相当于保持原配置的时长续期 request.session.set_expiry(request.session.get_expiry_age()) # 也可以直接硬编码时长,比如:request.session.set_expiry(15 * 24 * 60 * 60) response = self.get_response(request) return response
然后在settings.py的MIDDLEWARE列表里添加这个中间件,注意要放在AuthenticationMiddleware之后(因为需要用到request.user判断登录状态):
# settings.py MIDDLEWARE = [ # ... 其他默认中间件 'django.contrib.auth.middleware.AuthenticationMiddleware', 'your_app.middleware.SessionExpiryMiddleware', # 替换成你的App实际路径 # ... 其他中间件 ]
3. 可选优化:排除静态资源请求
如果你的网站有大量静态资源(CSS/JS/图片),可以在中间件里跳过这些请求,避免不必要的Session刷新:
# 修改中间件的__call__方法 def __call__(self, request): # 跳过静态资源路径的请求(根据你的STATIC_URL路径调整) if request.path.startswith('/static/'): return self.get_response(request) if request.user.is_authenticated: request.session.set_expiry(request.session.get_expiry_age()) response = self.get_response(request) return response
验证效果
- 用户登录后,每次访问任意页面,Session的过期时间都会被刷新为15天后
- 如果用户连续15天没有任何访问,Session会自动失效,再次访问时需要重新登录
内容的提问来源于stack exchange,提问作者user6013363




