1

我想在 FastApi 上有一个动态的强制性机构。

我解释 :

from fastapi import FastAPI, Body
from pydantic import BaseModel

app = FastAPI()

class Parameters(BaseModel):
    platform: str
    country: str

@app.put("/myroute")
async def provision_instance(*, parameters: Parameters = Body(...)):
    do_something

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=80)

在这里,我的 body 是在 Parameters 类中手动定义的,有两个属性,平台和国家。未来,这些属性将来自一个配置文件,并且会有两个以上的属性。所以我需要动态地自动创建它们。

例如,在配置文件中,我可以:

---
parameters:
  application:
    description: "Name of the application"
    type: string
  platform:
    description: "Name of the platform"
    type: string
  country:
    description: "Name of the country"
    type: string

在这种情况下,我怎么能在正文中拥有可变数量的参数?我应该找到一种方法为我的参数类提供可变数量的属性吗?

4

1 回答 1

1

Pydantic 模型可以按照文档本节中的描述动态构建。您仍然需要实现一个函数来读取您的 yaml 文件并从中构建 Pydantic 模型。


现在考虑 python 文件中的一些 Pydantic 模型;这不等于有一个描述模型的 yaml 文件吗?


如果你想出了这个动态构建 Pydantic 模型的计划,因为你将有多种形状的数据进入,你也可以探索使用typing.Union来定义你的端点:


class Parameters1(BaseModel):
    platform: str
    country: str


class Parameters2(BaseModel):
    application: str
    country: str


@app.put("/myroute")
async def provision_instance(*, parameters: Union[Parameters1, Parameters2] = Body(...)):
    if isinstance(parameters, Parameters1):
        pass  # TODO
    elif isinstance(parameters, Parameters2):
        pass  # TODO

于 2020-04-04T00:14:57.883 回答