Как отключить проверку схемы в FastAPI?

Я переношу службу с Flask на FastAPI и использую модели Pydantic для создания документации. Однако я немного не уверен в проверке схемы. Боюсь, что появятся какие-то неожиданные данные (например, другой формат поля), и он вернет ошибку.

В документации Pydantic есть способы создать модель без проверки схемы: https://pydantic-docs.helpmanual.io/usage/models/#creating-models-without-validation

Однако, поскольку это явно создается самим FastAPI, я не знаю, как отключить эту проверку схемы при возврате из FastAPI.


person Felipe Nunes    schedule 13.01.2021    source источник


Ответы (3)


Вы можете вернуть ответ напрямую или с помощью пользовательские ответы для автоматического преобразования. В этом случае данные ответа не проверяются на соответствие модели ответа. Но вы все равно можете задокументировать это, как описано в Дополнительные ответы в OpenAPI.

Пример:

class SomeModel(BaseModel):
    num: int


@app.get("/get", response_model=SomeModel)
def handler(param: int):
    if param == 1:  # ok
        return {"num": "1"}
    elif param == 2:  # validation error
        return {"num": "not a number"}
    elif param == 3:  # ok (return without validation)
        return JSONResponse(content={"num": "not a number"})
    elif param == 4:  # ok (return without validation and conversion)
        return Response(content=json.dumps({"num": "not a number"}), media_type="application/json")
person alex_noname    schedule 14.01.2021
comment
Вы также можете использовать тип Any. См. Ответ ниже. - person Sushi2all; 15.01.2021

FastAPI не требует какой-либо проверки, поэтому, если она вам не нужна, просто не используйте модели Pydantic или подсказки типов.

app.get('/')
async def your_function(input_param):
  return { 'param': input_param }

# Don't use models or type hints when defining the function params.
# `input_param` can be anything, no validation will be performed.

Однако, как правильно указал @Tryph, поскольку вы используете Pydantic для создания документации, вы можете просто использовать тип Any следующим образом:

from typing import Any
from pydantic import BaseModel

class YourClass(BaseModel):
    any_value: Any

Помните, что тип Any также принимает None, что делает поле необязательным. (См. Также typing.Any в документации по Pydantic)

person Sushi2all    schedule 14.01.2021
comment
пидантические модели также используются для создания документации. - person Tryph; 15.01.2021

Вы можете установить модель запроса как typing.Dict или typing.List

from typing import Dict

app.post('/')
async def your_function(body: Dict):
  return { 'request_body': body}

person Gabriel G.    schedule 21.01.2021