Динамическое тело в FastApi с использованием Pydantic

Хотелось бы иметь динамический обязательный орган на 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)

Здесь мое тело вручную определяется в классе 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

Как я мог иметь в этом контексте переменное количество параметров, требуемых в теле? Должен ли я найти способ дать моему классу Parameters переменное количество атрибутов?


person Nico    schedule 26.03.2020    source источник


Ответы (1)


Модели Pydantic можно строить динамически, как описано в этом разделе документации. Вам все равно придется реализовать функцию, которая будет читать ваш файл yaml и строить из него модель Pydantic.


Теперь рассмотрим несколько моделей Pydantic в файле Python; разве это не эквивалентно файлу yaml, описывающему модели?


Если вы придумали этот план динамического построения моделей Pydantic, потому что у вас будут входящие данные различной формы, вы также можете изучить его с помощью _ 1_ для определения конечной точки:


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

person Thomasleveil    schedule 04.04.2020
comment
Спасибо Томас за ответ. Мне действительно нужно использовать файл конфигурации yaml. У вас есть пример, где я мог бы построить модель Pydantic с динамическими ключами? - person Nico; 05.04.2020