Параметры запроса из pydantic модели

Есть ли способ преобразовать питантическую модель в параметры запроса в fastapi?

Некоторые из моих конечных точек передают параметры через тело, а некоторые передают их непосредственно в запросе. Все эти конечные точки используют одну и ту же модель данных, например:

class Model(BaseModel):
    x: str
    y: str

Я бы хотел избежать дублирования моего определения этой модели в определении моих "конечных точек параметров запроса", например, test_query в этом коде:

class Model(BaseModel):
    x: str
    y: str

@app.post("/test-body")
def test_body(model: Model): pass

@app.post("/test-query-params")
def test_query(x: str, y: str): pass

Какой самый чистый способ сделать это?


person cglacet    schedule 19.06.2020    source источник


Ответы (2)


В документации есть ярлык, чтобы избежать подобных повторений. . В этом случае это даст:

from fastapi import Depends

@app.post("/test-query-params")
def test_query(model: Model = Depends()): pass

Это позволит вам запросить /test-query-params?x=1&y=2, а также даст правильное описание OpenAPI для этой конечной точки.

Подобные решения можно использовать для использования моделей Pydantic в качестве дескрипторов данных формы.

person cglacet    schedule 19.06.2020
comment
Ух ты, огромное спасибо! Это ускользало от меня несколько месяцев! Не интуитивно понятно, что model: Model распознается как параметры тела, но model: Model = Depends() распознается как параметры запроса. Документы fastapi хороши и все такое, но иногда они не могут выделить такие ключевые моменты. - person mblakesley; 04.05.2021
comment
@mblakesley, не стесняйтесь обращаться за помощью по выделенному gitter, я думаю, именно так я получил эту информацию (gitter.im / tiangolo / fastapi) - person cglacet; 07.05.2021

Это решение очень удобно, если ваша схема минимальна.

Но когда дело доходит до такого сложного, как этот, Установить описание для параметра запроса в документе Swagger с использованием модели Pydantic, лучше использовать настраиваемый класс зависимостей

from fastapi import Depends, FastAPI, Query

app = FastAPI()


class Model:
    def __init__(
            self,
            y: str,
            x: str = Query(
                default='default for X',
                title='Title for X',
                deprecated=True
            )

    ):
        self.x = x
        self.y = y


@app.post("/test-body")
def test_body(model: Model = Depends()):
    return model

Если вы используете этот метод, у вас будет больше контроля над документом OpenAPI.

person JPG    schedule 15.10.2020
comment
Знаете ли вы, что вы также можете использовать Query определения в пидантических моделях? - person h345k34cr; 20.10.2020
comment
@ h345k34cr Да, верю. К сожалению, это не работает для связанного сообщения SO - person JPG; 20.10.2020
comment
Также стоит добавить сюда минимальный пример в качестве нового ответа, чтобы кто-то другой мог извлечь из этого пользу. @ h345k34cr - person JPG; 20.10.2020