Что такое FastAPI и почему его выбирают
FastAPI — это веб-фреймворк для построения HTTP-API на Python, который превращает обычные аннотации типов в работающую валидацию, документацию и сериализацию.
Суть в одном предложении: вы пишете обычную типизированную функцию на Python, а FastAPI бесплатно достраивает вокруг неё разбор запроса, проверку данных, формирование ответа и интерактивную документацию.
Когда вы строите бэкенд, перед вами всегда стоит одна и та же скучная, но критичная работа: принять HTTP-запрос, вытащить из него параметры пути, query-строку, заголовки и тело, проверить, что данные правильного типа и формата, превратить их в удобные объекты Python, выполнить бизнес-логику и аккуратно вернуть ответ в JSON. В классических фреймворках значительная часть этого кода пишется руками: вы вручную достаёте request.json, проверяете, что поле age действительно число, что оно не отрицательное, что обязательное поле не забыли прислать. Это тысячи строк однообразного кода, в которых легко ошибиться.
FastAPI переворачивает эту картину. Его ключевая идея: аннотации типов — это не комментарии, а исполняемая спецификация. Когда вы пишете, что параметр имеет тип int, а тело запроса описывается Pydantic-моделью, фреймворк использует эту информацию, чтобы автоматически разобрать запрос, проверить корректность, сконвертировать строку "42" в число 42 и вернуть понятную ошибку 422, если данные не подходят. Тот же самый тип одновременно становится строкой в автоматически сгенерированной документации OpenAPI.
Почему это стало стандартом именно сейчас? Сошлись три фактора. Во-первых, Python обзавёлся зрелой системой подсказок типов (typing, Annotated). Во-вторых, появился асинхронный стек ASGI, позволяющий держать тысячи одновременных соединений без блокировок. В-третьих, библиотека Pydantic довела валидацию данных до промышленного уровня, а в версии 2 переписала ядро на Rust ради скорости. FastAPI склеил эти три вещи в один инструмент.
Как работает под капотом
FastAPI — это надстройка над двумя библиотеками: Starlette (ASGI-слой: маршрутизация, запросы, ответы, middleware) и Pydantic (валидация и сериализация данных). Сам FastAPI добавляет к ним магию: он читает сигнатуру вашей функции через модуль inspect, смотрит на типы каждого параметра и строит из них «модель зависимостей». На основе этой модели для каждого запроса он знает, откуда брать данные, как их проверять и как описать в схеме OpenAPI.
Поток обработки одного запроса выглядит так:
HTTP-запрос | v [ ASGI-сервер: uvicorn ] | v [ Starlette: маршрутизация по пути и методу ] | v [ FastAPI: разбор параметров по типам ] | v [ Pydantic: валидация и конвертация ] | v [ ваша функция-обработчик ] | v [ Pydantic: сериализация результата в JSON ] | v HTTP-ответ
Чтобы почувствовать, какую именно работу берёт на себя фреймворк, представьте «ручную» валидацию query-параметра. Вот язык-независимая логика, которую FastAPI делает за вас. Запусти и поменяй значения:
def parse_age(raw):
# имитируем то, что FastAPI делает с query-параметром ?age=...
if raw is None:
raise ValueError("age обязателен")
try:
value = int(raw) # строка из URL -> число
except (TypeError, ValueError):
raise ValueError("age должен быть целым числом")
if value < 0:
raise ValueError("age не может быть отрицательным")
return value
for raw in ["42", "-5", "abc", None]:
try:
print(raw, "->", parse_age(raw))
except ValueError as e:
print(raw, "-> ошибка:", e)
Попробуй сам ▶ Этот десяток строк FastAPI генерирует автоматически из одной аннотации age: int = Query(ge=0).
Частые ошибки
Новички часто думают, что FastAPI — это «асинхронная Flask» и что любой код станет быстрым сам по себе. Это не так: производительность даёт асинхронность плюс грамотный код, а не имя фреймворка. Вторая ошибка — игнорировать типы и писать функции без аннотаций; тогда вы теряете ровно то, ради чего пришли, потому что без типов нет ни валидации, ни документации. Третья — путать FastAPI с полноценным фреймворком уровня Django: здесь нет встроенной ORM, админки и шаблонов, это намеренно тонкий слой именно для API.
Best practices
- Всегда аннотируйте типы — это «топливо» фреймворка, а не украшение.
- Держите бизнес-логику в отдельных функциях/сервисах, а обработчики — тонкими.
- Используйте автоматическую документацию
/docsкак живой контракт API с фронтендом. - Берите свежую версию (0.115+ с Pydantic v2), чтобы получить скорость и актуальный API.
Когда FastAPI — не лучший выбор
Честность важнее хайпа. FastAPI силён там, где нужно API: JSON-сервисы, бэкенд для SPA и мобильных приложений, микросервисы, шлюзы. Но если вам нужен монолит с серверным рендерингом HTML-страниц, встроенной админкой, готовой системой пользователей и зрелой ORM «из коробки», полноценный фреймворк вроде Django сэкономит недели. FastAPI намеренно тонкий: он не навязывает структуру проекта, выбор ORM, систему миграций. Эта свобода — преимущество для опытной команды и источник растерянности для новичка, которому приходится выбирать и собирать стек самому. Поэтому правильная формулировка не «FastAPI лучше», а «FastAPI лучше для определённого класса задач — построения API с акцентом на типы, валидацию и асинхронность».
Итог: FastAPI — это тонкий, но мощный слой, превращающий типизированные функции Python в полноценное API с валидацией и документацией «из коробки». В следующих уроках мы разберём, как именно он использует async, типы и Pydantic.