Входные данные и Pydantic v2

POST, JSON-тело и первая модель запроса

Содержание курса

Аргумент-тело в обработчике: получение объекта RoomIn и доступ к полям

Когда аргумент функции-обработчика аннотирован подклассом BaseModel, FastAPI автоматически читает его из тела запроса — не из пути и не из query-строки. Механизм вывода источника встроен в FastAPI: он смотрит на тип аннотации.

Полный рабочий файл выглядит так:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class RoomIn(BaseModel):
    name: str
    floor: int
    capacity: int

@app.post("/api/rooms")
def create_room(room: RoomIn):
    return {"received": room.name, "floor": room.floor, "capacity": room.capacity}

Внутри create_room переменная room — это уже готовый объект RoomIn с проверенными полями. Обращение к ним — обычный доступ к атрибутам: room.name, room.floor, room.capacity.

Чтобы проверить в /docs: откройте секцию POST /api/rooms, нажмите Try it out, в поле Request body введите:

{"name": "Лондон", "floor": 2, "capacity": 6}

Нажмите Execute. Ответ будет 200 и тело:

{"received": "Лондон", "floor": 2, "capacity": 6}

/docs отправляет запрос с заголовком Content-Type: application/json — он сообщает серверу формат тела. FastAPI ориентируется именно на него при разборе.

Обработчик может одновременно принимать аргумент-тело и query-параметры или path-параметры: они не конфликтуют, FastAPI разбирает каждый источник отдельно. Данные здесь не сохраняются — обработчик просто возвращает то, что получил, и это достаточно, чтобы убедиться: контракт работает.

JSON-тело POST /api/rooms содержит name Лондон, floor 2, capacity 6. FastAPI проверяет тело по модели RoomIn с типами str, int, int. Обработчик create_room получает room: RoomIn и читает room.name как Лондон.
Аннотация room: RoomIn связывает аргумент с JSON-телом. После проверки обработчик получает модель и читает её атрибуты.