FastAPI:使用多个依赖项(函数),每个依赖项都有 pydantic 请求体
FastAPI: Using multiple dependencies (functions), each with pydantic request bodies
我试图通过 FastAPI 注入两个依赖函数,每个函数都有自己的请求主体,并构成单独端点的一部分到另一个端点的路径操作中。请参阅下面的示例以供说明:
from fastapi import FastAPI, Depends
from pydantic import BaseModel
app = FastAPI()
class RequestBodyChild1(BaseModel):
item1: float
item2: float
class RequestBody1(BaseModel):
parent1: RequestBodyChild1
@app.post("/function_1")
def function_1(request: RequestBody1):
return request
class RequestBodyChild2(BaseModel):
itemA: float
itemB: float
class RequestBody2(BaseModel):
parent2: RequestBodyChild2
@app.post("/function_2")
def function_2(request: RequestBody2):
return request
@app.post("/function_3")
def function_3(request_1: dict = Depends(function_1), request_2: dict = Depends(function_2)):
merged_dict = dict(request_1.items() + request_2.items())
return merged_dict
问题是 function_3
端点 OpenAPI/Swagger 仅显示 request_1: dict = Depends(function_1)
的请求 body/example 架构:
{
"parent1": {
"item1": 0,
"item2": 0
}
}
如何确保包含两个请求正文?沿着:
{
"parent1": {
"item1": 0,
"item2": 0
},
"parent2": {
"itemA": 0,
"itemB": 0
}
}
您看到结果的原因是您在两个函数中使用了相同的参数名称 - 当您以这种方式使用 Depends
时,将使用函数中的参数名称(注册为视图的功能不相关;只是它是一个功能);因为在这两种情况下都是一样的,所以你只会得到一个参数名称。如果将 function_2
中的参数重命名为 request2
:
,您可以看到此更改
{
"request": {
"parent1": {
"item1": 0,
"item2": 0
}
},
"request2": {
"parent2": {
"itemA": 0,
"itemB": 0
}
}
}
要实现您描述的请求格式,我认为您必须直接在 function_3
上定义 parent1: RequestBodyChild1, parent2: RequestBodyChild2
,然后手动调用依赖函数。
def function_3(parent1: RequestBodyChild1, parent2: RequestBodyChild2):
...
这解析为:
{
"parent1": {
"item1": 0,
"item2": 0
},
"parent2": {
"itemA": 0,
"itemB": 0
}
}
我试图通过 FastAPI 注入两个依赖函数,每个函数都有自己的请求主体,并构成单独端点的一部分到另一个端点的路径操作中。请参阅下面的示例以供说明:
from fastapi import FastAPI, Depends
from pydantic import BaseModel
app = FastAPI()
class RequestBodyChild1(BaseModel):
item1: float
item2: float
class RequestBody1(BaseModel):
parent1: RequestBodyChild1
@app.post("/function_1")
def function_1(request: RequestBody1):
return request
class RequestBodyChild2(BaseModel):
itemA: float
itemB: float
class RequestBody2(BaseModel):
parent2: RequestBodyChild2
@app.post("/function_2")
def function_2(request: RequestBody2):
return request
@app.post("/function_3")
def function_3(request_1: dict = Depends(function_1), request_2: dict = Depends(function_2)):
merged_dict = dict(request_1.items() + request_2.items())
return merged_dict
问题是 function_3
端点 OpenAPI/Swagger 仅显示 request_1: dict = Depends(function_1)
的请求 body/example 架构:
{
"parent1": {
"item1": 0,
"item2": 0
}
}
如何确保包含两个请求正文?沿着:
{
"parent1": {
"item1": 0,
"item2": 0
},
"parent2": {
"itemA": 0,
"itemB": 0
}
}
您看到结果的原因是您在两个函数中使用了相同的参数名称 - 当您以这种方式使用 Depends
时,将使用函数中的参数名称(注册为视图的功能不相关;只是它是一个功能);因为在这两种情况下都是一样的,所以你只会得到一个参数名称。如果将 function_2
中的参数重命名为 request2
:
{
"request": {
"parent1": {
"item1": 0,
"item2": 0
}
},
"request2": {
"parent2": {
"itemA": 0,
"itemB": 0
}
}
}
要实现您描述的请求格式,我认为您必须直接在 function_3
上定义 parent1: RequestBodyChild1, parent2: RequestBodyChild2
,然后手动调用依赖函数。
def function_3(parent1: RequestBodyChild1, parent2: RequestBodyChild2):
...
这解析为:
{
"parent1": {
"item1": 0,
"item2": 0
},
"parent2": {
"itemA": 0,
"itemB": 0
}
}