Flask session在API请求间不保留数据,React/Flask/Postgres项目问题问询
问题原因排查
- HTTPS cookie规则限制:你配置了
SESSION_COOKIE_SECURE = True,该规则要求浏览器仅在HTTPS协议的请求下存储和携带session cookie,你当前后端使用HTTP协议暴露服务,Chrome、Firefox等现代浏览器会直接拒绝存储该cookie,Postman对该规则校验较松因此可以正常存储。 - CORS配置不兼容:你同时开启了
supports_credentials=True和origins="*",浏览器CORS规范明确禁止带凭证的跨域请求使用通配符origin,该配置会导致浏览器拦截响应头中的set-cookie指令,无法存储session cookie。 - Session持久化时机问题:Flask-Session默认在请求结束、返回响应时才会将session的修改写入到持久化存储(你配置的是filesystem),你在login路由中刚给
session['user_id']赋值就调用loadUser(),如果loadUser()是从持久化存储读取session,此时数据还未写入,自然读不到对应值。
对应解决方案
- 调整开发环境的cookie安全配置,上线切换HTTPS后再改回原值:
# 开发环境设为False,生产环境自动设为True app.config['SESSION_COOKIE_SECURE'] = app.config['ENV'] == 'production'
- 修正CORS配置,将通配符origin替换为你实际的前端访问地址,比如本地React开发地址为
http://localhost:3000时配置如下:
cors = CORS(app, support_credentials=True, resources={ r"/*": { "origins": ["http://localhost:3000"] # 替换为你的前端实际地址,多个地址用逗号分隔 } })
- 修复同路由内
loadUser()读不到session的问题,二选一即可:
- 直接将
user[0]作为参数传递给loadUser(),不需要从session读取 - 赋值session后手动触发持久化,再调用
loadUser():
session['user_id'] = user[0] session.save() # flask-session扩展提供的方法,手动写入存储 loadUser()
- 可选优化:明确设置session cookie名称,避免和其他本地服务的cookie冲突:
app.config['SESSION_COOKIE_NAME'] = 'my_react_flask_app_session'
内容的提问来源于stack exchange,提问作者eboone20053
相关产品推荐
相关产品推荐

