You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.pyMIDDLEWARE列表里添加这个中间件,注意要放在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

火山引擎 最新活动