Ограничения полей и ошибки валидации
Уроки курсаОграничения полей и ошибки валидации
Как прочитать ответ 422 и найти неверное поле
Возьмём полный маршрут с моделью, которую объявили выше:
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class RoomIn(BaseModel):
name: str = Field(..., min_length=2, max_length=50)
capacity: int = Field(..., ge=1, le=50)
@app.post("/api/rooms")
def create_room(room: RoomIn):
return {"received_name": room.name, "capacity": room.capacity}
Отправим запрос с намеренно неверными значениями:
{"name": "А", "capacity": 0}
FastAPI вернёт статус 422. Ниже сокращённое тело ответа: у каждой ошибки оставлены loc, msg и type.
{
"detail": [
{
"loc": ["body", "name"],
"msg": "String should have at least 2 characters",
"type": "string_too_short"
},
{
"loc": ["body", "capacity"],
"msg": "Input should be greater than or equal to 1",
"type": "greater_than_equal"
}
]
}
detail — массив: каждый объект описывает одно нарушение. Для диагностики рассмотрим три показанных поля; в полном ответе могут быть и другие, например input и ctx.
loc — путь к проблемному месту. Первый элемент "body" говорит, что ошибка в JSON-теле запроса. Второй — имя конкретного поля модели. По этому пути сразу понятно, что исправлять.
msg — человекочитаемое описание: что именно нарушено. Видно, что name слишком короткое, а capacity меньше 1.
type — машинный код ошибки: удобен, если нужно обрабатывать ответ программно.
В данном случае оба поля нарушены одновременно, поэтому detail содержит два объекта. Чтобы исправить запрос, достаточно передать name длиной от 2 до 50 символов и capacity от 1 до 50 — например, {"name": "Малый зал", "capacity": 10}.
![Поле capacity: int ограничено Field(..., ge=1, le=50). Переданное capacity 0 даёт 422 до вызова обработчика. В одном элементе detail loc равен [body, capacity], а msg сообщает Input should be greater than or equal to 1.](/uploads/lesson-media/field_error-1788107190599-0f86e12a-670e-4204-9275-e61ad785ba98.png)
