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
  }
}