You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask设置Cookie过期时间后Cookie失效返回None问题排查

问题原因

核心错误是传入set_cookie的expires参数是无时区信息的naive datetime对象,Werkzeug(Flask依赖的HTTP底层处理库)在生成Set-Cookie响应头时,对无时区信息的datetime处理逻辑存在版本差异,会将你传入的本地时间误按UTC时间解析,最终生成的Expires字段时间早于当前请求时间,浏览器判定Cookie已过期就会直接丢弃,因此后续请求读取时返回None。

从日志可以看到,你是通过datetime.datetime.now()(生成本地无时区时间)加5分钟的方式生成过期时间,这个时间本身是本地时区的未来时间,但序列化到Cookie头时被错误按UTC时间转换,对于非UTC时区的运行环境,最终生成的过期时间和预期存在整段时区偏移,实际已经是过去时间。

修复方案

推荐两种修复方式,优先选第一种,出错概率最低:

  • 方案1:替换为max_age参数,直接传入Cookie有效时长的秒数,不需要处理任何时区转换,全浏览器兼容性最好:
# 5分钟有效期直接传300秒
resp.set_cookie(
    "sessionData",
    json.dumps(sessionData),
    max_age=5*60
)
  • 方案2:如果必须使用expires参数,请生成带UTC时区信息的datetime对象传入,不要使用无时区的naive时间:
import datetime
# 生成带UTC时区的当前时间,再加5分钟有效期
expire_time = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=5)
resp.set_cookie(
    "sessionData",
    json.dumps(sessionData),
    expires=expire_time
)
额外说明

之前不设置expires时Cookie运行正常,是因为不传该参数时Cookie为会话级Cookie,浏览器关闭前一直有效,不存在过期时间解析错误的问题。

内容的提问来源于stack exchange,提问作者gdhp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:19:50