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
相关产品推荐
相关产品推荐

