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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:55:18