FastAPI中使用SessionMiddleware无法从会话获取变量的问题排查
解决FastAPI SessionMiddleware会话无法持久化的问题
嘿,问题很明显——你在添加SessionMiddleware的时候设置了max_age=0!这个参数控制的是会话Cookie的过期时间(单位是秒),设成0的话,Cookie会立即过期,等你调用/b接口的时候,之前存在会话里的my_var早就跟着失效的Cookie一起没了,自然返回空。
修复方案
把max_age改成一个正数(比如3600,代表1小时过期),或者直接省略这个参数(默认会用浏览器会话时长,也就是关闭浏览器才过期)。修改后的代码如下:
import uvicorn from fastapi import FastAPI, Request from starlette.middleware.sessions import SessionMiddleware app = FastAPI() # 这里把max_age改为3600秒,也可以直接删掉max_age参数 app.add_middleware(SessionMiddleware, secret_key="some-random-string", max_age=3600) @app.get("/a") async def session_set(request: Request): request.session["my_var"] = "1234" return 'ok' @app.get("/b") async def session_info(request: Request): my_var = request.session.get("my_var", None) return my_var if __name__ == '__main__': uvicorn.run('http-session:app', port=5000, reload=True)
额外注意事项
- 测试时要保证用同一个请求上下文调用
/a和/b:比如用同一个浏览器窗口,或者用HTTP客户端(比如requests)时要保存Cookie(可以用requests.Session()来维持会话)。 - 生产环境里
secret_key一定要用安全的随机字符串,别用示例里的"some-random-string",可以用Python的secrets.token_hex(32)生成一个靠谱的密钥。
内容的提问来源于stack exchange,提问作者28 Lucky
相关产品推荐
相关产品推荐

