session_cookie_age 控制浏览器中 sessionid cookie 的过期时间(秒),不影响服务端 session 数据存续;其生效需 session_expire_at_browser_close=false 且 session_save_every_request=true 等条件配合。

SESSION_COOKIE_AGE 是 Django 中控制 Session Cookie 有效期(单位:秒) 的核心配置项,在 Django 4.2 中它依然生效,但其作用方式有明确前提和边界,不能直接等同于“Session 数据本身存活多久”。
SESSION_COOKIE_AGE 控制的是 Cookie 的过期时间,不是 Session 数据的过期时间
这个参数只影响浏览器中存储的 sessionid Cookie 的 Expires/Max-Age 属性:
- 它告诉浏览器:这个 Cookie 最多保留多少秒,之后自动删除;
- 浏览器据此决定是否在后续请求中携带该 Cookie;
-
但它不直接删除服务端的 Session 数据(比如数据库里的
django_session记录)。
举个例子:
假设设置 SESSION_COOKIE_AGE = 1800(30分钟): - 用户登录后,浏览器收到带 `Max-Age=1800` 的 `sessionid` Cookie; - 如果用户关闭浏览器再打开(且未勾选“继续上次会话”),该 Cookie 通常已失效,无法再发给服务端; - 但服务端数据库里对应的 session 记录可能还存在(直到被清理或超时)。Session 数据真正过期,由 SESSION_EXPIRE_AT_BROWSER_CLOSE 和中间件共同决定
Django 4.2 的 Session 过期逻辑分两层:
-
客户端层面:靠
SESSION_COOKIE_AGE或SESSION_EXPIRE_AT_BROWSER_CLOSE=True控制 Cookie 生命周期; -
服务端层面:靠
SESSION_ENGINE对应的后端策略 +SESSION_SAVE_EVERY_REQUEST配合实现实际清理。
常见组合行为:
- 若
SESSION_EXPIRE_AT_BROWSER_CLOSE = True,则 Cookie 不设Expires,仅靠浏览器会话维持(关闭浏览器即失效),此时SESSION_COOKIE_AGE被忽略; - 若
SESSION_EXPIRE_AT_BROWSER_CLOSE = False(默认),则SESSION_COOKIE_AGE生效,Cookie 带明确过期时间; - 无论哪种,服务端 Session 数据是否被清除,取决于:
- 数据库存储后端:Django 默认每 1/6 次请求执行一次
Session.objects.expire_sessions()清理(基于expire_date字段); - 缓存后端(如
cache或cached_db):依赖缓存自身的 TTL 策略,SESSION_COOKIE_AGE通常会同步设为缓存 key 的timeout。
- 数据库存储后端:Django 默认每 1/6 次请求执行一次
确保 SESSION_COOKIE_AGE 生效的关键点
- ✅ 必须在
settings.py中显式设置(Django 4.2 不再提供默认值,若不设则使用内置默认 1209600 秒 ≈ 2 周); - ✅
SESSION_SAVE_EVERY_REQUEST = True时,每次请求都会刷新 Cookie 的过期时间(即重置Max-Age),否则 Cookie 到期后不再续期; - ✅ 使用数据库后端时,需定期运行
python manage.py clearsessions(推荐加入定时任务),否则过期 session 记录不会自动从 DB 删除; - ✅ 若用
cache后端(如 Redis),SESSION_COOKIE_AGE会作为cache.set(..., timeout=...)的 timeout 参数,自动生效; - ❌
SESSION_COOKIE_AGE对request.session.set_expiry()的手动设置无覆盖能力——后者优先级更高。
典型配置示例(Django 4.2)
# settings.py SESSION_COOKIE_AGE = 3600 # 1小时 SESSION_EXPIRE_AT_BROWSER_CLOSE = False SESSION_SAVE_EVERY_REQUEST = True # 每次请求都刷新 Cookie 过期时间 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
这样配置后:
- 用户只要 1 小时内有任意操作,Cookie 就会不断续期;
- 超过 1 小时无活动 → Cookie 过期 → 浏览器不再发送
sessionid→ 视图中request.session为空或新建; - 服务端旧 session 数据会在下一次
clearsessions或缓存自动淘汰时清理。
不复杂但容易忽略。











