Короткий ответ
FastAPI автоматически вернёт статус 422 Unprocessable Entity с JSON-телом, содержащим список ошибок (detail) с указанием места (loc), типа ошибки и сообщения для каждого некорректного поля.
Как это работает подробнее
При несовпадении данных запроса со схемой Pydantic выбрасывается RequestValidationError, которую Starlette/FastAPI перехватывают встроенным обработчиком исключений и преобразуют в стандартизированный JSON-ответ без необходимости писать код обработки вручную.
Пример кода
example.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class UserIn(BaseModel):
age: int
@app.post("/users/")
def create_user(user: UserIn):
return user
# POST {"age": "not-a-number"}
# -> 422
# {"detail": [{"loc": ["body", "age"], "msg": "Input should be a valid integer", "type": "int_parsing"}]}Что использовать на практике
- Практика. Формат ошибки единый для всех эндпоинтов приложения, что упрощает обработку на стороне клиента. При необходимости можно переопределить обработчик через
@app.exception_handler(RequestValidationError), если нужен другой формат (например, под конкретный стандарт API).
Подводные камни
- Риск. Путают
422(ошибка валидации входных данных) с400(общая ошибка клиента) — в чистом FastAPI для ошибок валидации Pydantic именно422; пишут собственную ручную валидацию там, где достаточно объявить типы в Pydantic-модели.