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

#python #validation #schema #fastapi #pydantic

#python #проверка #схема #fastapi #pydantic

Вопрос:

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

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

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

Ответ №1:

Вы можете вернуть ответ напрямую или с помощью пользовательских ответов для автоматического преобразования. В этом случае данные ответа не проверяются на соответствие модели ответа. Но вы все равно можете задокументировать это, как описано в Дополнительных ответах в 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")
 

Комментарии:

1. Вы также можете использовать Any тип. Смотрите Ответ ниже.

Ответ №2:

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

 from typing import Dict

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

 

Ответ №3:

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 тип, подобный so:

 from typing import Any
from pydantic import BaseModel

class YourClass(BaseModel):
    any_value: Any
 

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

Комментарии:

1. модели pydantic также используются для создания документации.