Что такое 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.

Проверьте себя
1. В чём ключевая идея FastAPI?
AОн автоматически создаёт базу данных под каждый запрос
BАннотации типов Python используются как исполняемая спецификация для валидации, сериализации и документации
CОн заменяет HTTP на собственный бинарный протокол
DОн пишет бизнес-логику за разработчика
2. На каких двух библиотеках построен FastAPI?
ADjango и Celery
BFlask и Marshmallow
CStarlette (ASGI) и Pydantic (валидация)
DTornado и SQLAlchemy