#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 также используются для создания документации.