flask中session过期需同时设置session.permanent=true和permanent_session_lifetime为timedelta对象,否则仍为临时会话;2.3+版本不再接受整数秒配置,且默认cookie-based session无法主动销毁,长期控制应改用redis等服务端方案。

Session过期时间由 PERMANENT_SESSION_LIFETIME 和 session.permanent 共同控制
Flask 默认的 session 是“临时会话”,浏览器关闭即失效,不走过期时间逻辑。真要设过期时间,必须显式标记为 permanent,并配置生命周期——只改一个没用。
-
app.config['PERMANENT_SESSION_LIFETIME']设的是timedelta对象(比如timedelta(minutes=30)),不是秒或字符串 - 必须在每次写 session 前或后调用
session.permanent = True,否则配置被忽略 - 如果用的是默认的
SecureCookieSessionInterface(即没换 session backend),过期时间最终写进 Cookie 的Expires和Max-Age字段,受浏览器限制
设置 30 分钟过期的典型写法
常见错误是只配了 PERMANENT_SESSION_LIFETIME 却忘了设 permanent,结果 session 依然随浏览器关闭消失。
from flask import Flask, session
from datetime import timedelta
<p>app = Flask(<strong>name</strong>)
app.secret_key = 'your-secret-key'</p><h1>必须配置为 timedelta 对象</h1><p>app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30)</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill4246" title="Session Cleaner"><img
src="https://img.php.cn/upload/skill/000/000/081/178997406270626.jpg" alt="Session Cleaner" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill4246" title="Session Cleaner" class="overflowclass">Session Cleaner</a>
<p class="overflowclass">清理过期OpenClaw会话文件,保留当前主会话和所有群组会话,其余移至备份目录。</p>
</div>
<a rel="nofollow" href="/xiazai/skill4246" title="Session Cleaner" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>@app.route('/login')
def login():
session['user_id'] = 123
session.permanent = True # 关键:这行不能漏
return 'logged in'</p>
注意 Flask 2.3+ 的变更:PERMANENT_SESSION_LIFETIME 类型更严格
Flask 2.3 起,该配置项不再接受整数秒(如 1800),只认 timedelta。传错类型会静默失败或抛 TypeError,但 session 表现仍像临时会话。
- 错误写法:
app.config['PERMANENT_SESSION_LIFETIME'] = 1800 - 正确写法:
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(seconds=1800)或timedelta(minutes=30) - 调试建议:在视图里打印
session.get('_permanent', False)和app.config.get('PERMANENT_SESSION_LIFETIME')确认是否生效
真正需要长期/服务端控制过期?别用默认 Session
基于 Cookie 的 session 天然受限:无法主动销毁、时间精度依赖客户端时钟、不防篡改。如果业务要求“用户登出后所有设备立即失效”或“管理员踢人”,必须换方案。
- 推荐用 Redis +
Flask-Session:把 session 存服务端,过期由 Redis TTL 控制,可主动删 key - JWT 方式需自行管理黑名单或短生命周期 + refresh token,和 Flask 原生 session 机制无关
- 哪怕只改
SESSION_COOKIE_MAX_AGE,也只是影响 Cookie 字段,不改变 Flask 内部的 permanent 判断逻辑
实际部署时,session.permanent = True 这行最容易被遗忘,而且没有运行时报错,只能靠测 Cookie 的 Max-Age 值或抓包验证。










