在 flask 2.3 中,设 session.permanent = true 可使 session 持久化,即浏览器关闭后仍有效;需配合 app.permanent_session_lifetime(默认31天)控制实际有效期,底层通过设置 cookie 的 expires 和 max-age 实现。

在 Flask 2.3 中,把 session.permanent 设为 True 是控制 session 是否“持久化”的关键操作——它让 session 在浏览器关闭后仍保留一段时间,而不是随浏览器关闭立即失效。
设置 permanent=True 的基本写法
只需在写入 session 前或后,显式赋值即可:
from flask import Flask, session, request, redirect, url_for
<p>app = Flask(<strong>name</strong>)
app.secret_key = 'your-secret-key-here' # 必须设置,否则报错</p><p>@app.route('/login')
def login():
session['logged_in'] = True
session.permanent = True # ? 关键这行
return redirect(url_for('index'))
</p>
注意:这个赋值必须在 同一请求周期内、且在 session 被写入响应前完成。通常放在视图函数中设置 session 数据之后、返回响应之前。
配合 permanent_lifetime 控制实际有效期
仅设 permanent=True 不够,Flask 还需要知道“永久”到底多长。默认使用 app.permanent_session_lifetime(单位:秒),默认是 31 天(timedelta(days=31))。
你可以按需调整:
- 全局设置(推荐):
from datetime import timedelta app.permanent_session_lifetime = timedelta(hours=2) # 2 小时后过期
- 或运行时动态设置(较少用):
session.permanent = True app.permanent_session_lifetime = timedelta(minutes=30)
底层原理和注意事项
Flask 2.3 默认仍使用签名 Cookie 存储 session(即 session 数据加密后存在客户端 cookie 中),permanent=True 实际影响的是该 cookie 的 Expires 和 Max-Age 属性:
- 如果没设 permanent,cookie 是 session 级别的(浏览器关闭即删)
- 设了 permanent=True 后,Flask 自动给 cookie 加上
Expires时间(基于permanent_session_lifetime) - 服务端 session 数据本身不额外存储;安全性依赖
secret_key和签名机制
验证是否生效的小技巧
可在视图中打印当前 session 的过期时间参考(非直接暴露,但可用于调试):
@app.route('/debug')
def debug_session():
print("session.permanent:", session.permanent)
print("app.permanent_session_lifetime:", app.permanent_session_lifetime)
return "check console"
同时用浏览器开发者工具 → Application → Cookies 查看 session 字段的 Expires 时间是否已设置,是最直观的验证方式。











