FastAPI子依赖缓存疑问:请求体修改未生效问题咨询
FastAPI依赖修改请求体未生效问题
问题描述
各位好,我在FastAPI文档中了解到多次使用子依赖会缓存返回值,也知道Body属于依赖,但遇到了问题:我期望接口中的body参数能体现子依赖里修改后的结果,却未实现,请问问题出在哪里?
代码示例
from fastapi import FastAPI, Body, Depends from pydantic import BaseModel app = FastAPI() class ReqBody(BaseModel): name: str email: str def format_body(body: ReqBody = Body()): body.email += "@xx.com" @app.post("/") async def post(f_body = Depends(format_body), body: ReqBody = Body()): print(body)
问题原因
- 依赖函数未返回修改后的对象:
format_body函数仅在内部修改了body的属性,但没有返回这个修改后的对象。FastAPI依赖的核心逻辑是通过返回值传递数据,而非直接修改传入对象后自动同步到其他参数。 - 重复声明Body参数导致重新解析:接口函数中再次使用
body: ReqBody = Body(),会重新从请求体解析生成新的ReqBody实例,而非复用依赖中修改后的对象。即使依赖有缓存机制,这里也因为没有接收依赖返回值而无法获取修改结果。
解决方案
修改依赖函数,让它返回修改后的对象,然后在接口中直接使用该依赖的返回值:
from fastapi import FastAPI, Body, Depends from pydantic import BaseModel app = FastAPI() class ReqBody(BaseModel): name: str email: str def format_body(body: ReqBody = Body()): body.email += "@xx.com" return body # 返回修改后的对象 @app.post("/") async def post(body: ReqBody = Depends(format_body)): print(body)
这样接口接收的body就是经过依赖处理后的结果,符合预期。
补充说明
FastAPI的依赖缓存机制是指同一请求中,同一个依赖只会执行一次,返回值会被缓存供后续使用。但原代码中format_body没有返回值,缓存的是None,接口参数又重新解析原始请求体,自然看不到修改效果。
内容的提问来源于stack exchange,提问作者balalals
相关产品推荐
相关产品推荐

