Ответ
Основным инструментом для сериализации и валидации данных в FastAPI является библиотека Pydantic.
Она выполняет две ключевые функции:
-
Десериализация и Валидация (Входящие данные): Когда запрос поступает на эндпоинт, FastAPI использует модель Pydantic, указанную в аннотации типа, для парсинга, валидации и преобразования входящих данных (например, JSON) в типизированный Python-объект. Если данные не соответствуют схеме (неверный тип, отсутствуют обязательные поля), FastAPI автоматически возвращает клиенту ошибку
422 Unprocessable Entityс подробным описанием проблемы. -
Сериализация (Исходящие данные): Когда эндпоинт возвращает объект (например, экземпляр модели Pydantic или ORM-модель), FastAPI использует Pydantic для его преобразования в JSON-формат, который отправляется в теле ответа.
Пример:
from fastapi import FastAPI
from pydantic import BaseModel
# 1. Определение модели Pydantic для валидации и сериализации
class Item(BaseModel):
name: str
price: float
is_offer: bool | None = None # Необязательное поле
app = FastAPI()
@app.post("/items/")
# 2. FastAPI использует Item для валидации тела запроса
async def create_item(item: Item):
# Здесь 'item' — это уже валидный экземпляр класса Item
print(item.name)
# 3. Возвращаемый объект будет автоматически сериализован в JSON
return item
Почему это важно?
- Надежность: Строгая типизация и автоматическая валидация предотвращают ошибки, связанные с некорректными данными.
- Автоматическая документация: FastAPI анализирует модели Pydantic для автоматической генерации интерактивной документации (Swagger UI / ReDoc), включая схемы данных, типы полей и обязательность.
- Чистый код: Логика валидации и структура данных инкапсулированы в моделях, что делает код эндпоинтов более лаконичным и сфокусированным на бизнес-логике.
Ответ 18+ 🔞
А, слушай-ка, про этот самый Pydantic в FastAPI! Ну, это ж, блядь, как золотой ключик у Буратино, только для данных, ёпта. Без него — пиздец и распиздяйство, а с ним — красота и порядок, в рот меня чих-пых!
Короче, эта библиотека — главный по тарелочкам. Она делает две вещи, и обе — овердохуища важные:
-
Разбор и проверка (когда данные к нам прутся): Представь: прилетает к нам на эндпоинт какой-то JSON, наляпанный кривыми ручками. FastAPI хватает твою Pydantic-модель, которую ты в параметрах указал, и начинает этим JSON'ом в неё тыкать. Если всё по схеме — тип правильный, поля на месте — она делает из этой хуйни нормальный, типизированный питонячий объект. А если там, например, число там, где строка должна быть, или обязательное поле забыли — она сразу, блядь, клиенту в ответ: «Мудак! 422 ошибка!», да ещё и распишет, где именно он обосрался. Удобно, сука!
-
Упаковка (когда мы данные обратно шлём): Ну, отработал твой эндпоинт, получил какую-нибудь ORM-модель или свой объект. Надо ж её в JSON превратить, чтобы по HTTP ушло. FastAPI опять зовёт Pydantic: «Ну-ка, ёпта, упакуй это добро!». И тот аккуратненько всё превращает в красивый JSON, который уже можно клиенту в сраку отправить.
Смотри, как это выглядит, на примере:
from fastapi import FastAPI
from pydantic import BaseModel
# 1. Вот она, наша модель-надзиратель. Диктует, как данные должны выглядеть.
class Item(BaseModel):
name: str # Имя — строка, обязательно!
price: float # Цена — число, обязательно!
is_offer: bool | None = None # А это поле — по желанию. Может быть булевым, а может и хуй с ним.
app = FastAPI()
@app.post("/items/")
# 2. Смотри магию: FastAPI сам подставит сюда объект `Item`, проверив входящий JSON.
async def create_item(item: Item):
# Тут `item` — уже не словарь, а честный объект с полями `name`, `price` и т.д.
print(item.name)
# 3. А когда возвращаем его — он сам в JSON превратится. Красота!
return item
И почему это, блядь, гениально?
- Надёжность, ёбана: Ты больше не будешь ловить
KeyErrorилиTypeErrorв глубине логики, потому что вся хуйня отсеивается на входе. Данные уже чистые. - Документация сама пишется: FastAPI смотрит на твои модели и автоматом рисует схемы в Swagger. Кликнул — и видишь, что и куда слать. Вообще, блядь, волшебство!
- Код не превращается в говно: Вся валидация — в моделях. Внутри эндпоинта ты работаешь с понятными объектами, а не ковыряешься в
request.json(), как последний гандон. Чистота, блядь!