Учебник FastAPI для начинающих
Полный курс по FastAPI — современному фреймворку для построения HTTP-API на Python. Вы поймёте не только «как», но и «почему»: как аннотации типов превращаются в валидацию и документацию, как работает асинхронность и event loop, как устроены Pydantic v2, система зависимостей, жизненный цикл приложения и безопасность.
Курс построен на актуальных практиках 2024-2025: lifespan вместо устаревших on_event, зависимости через Annotated, Pydantic v2 с методами model_validate/model_dump, OAuth2 с JWT. Каждый урок разбирает тему вглубь, показывает работу «под капотом» на запускаемых примерах и заканчивается частыми ошибками и best practices.
Курс «FastAPI: API на Python» состоит из 10 разделов и 40 уроков: Введение и асинхронность, Эндпоинты и параметры, Pydantic: модели и валидация, Зависимости (Dependency Injection), База данных, ошибки и безопасность, Практика: продакшен-ready API, Асинхронность и конкурентность, Pydantic v2 вглубь, Архитектура больших приложений и Тестирование и продакшен. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение и асинхронность
- Что такое FastAPI и почему его выбирают
Знакомство с FastAPI: ASGI, типы Python, автодокументация и почему фреймворк стал стандартом для API на Python в 2024-2025.
- Синхронность, асинхронность и event loop
Как работает async/await в Python, что такое event loop, чем async def отличается от обычного def и почему это важно для FastAPI.
- async def и def обработчики: что выбрать
Чем отличаются async def и обычные def обработчики в FastAPI, как работает threadpool для синхронного кода и как не заблокировать сервер.
- Первое приложение и запуск через uvicorn
Создаём минимальное FastAPI-приложение, запускаем его через uvicorn, разбираем декораторы маршрутов и интерактивную документацию /docs.
- Что такое FastAPI и почему его выбирают
2 Эндпоинты и параметры
- Параметры пути и их валидация
Path-параметры в FastAPI: как объявлять, как работает автоматическая конвертация типов, валидация через Path и порядок маршрутов.
- Query-параметры, значения по умолчанию и Annotated
Query-параметры в FastAPI: обязательные и опциональные, значения по умолчанию, ограничения через Query и современный синтаксис Annotated.
- Тело запроса, методы и коды статусов
Как принимать тело запроса через Pydantic-модели, чем отличаются GET/POST/PUT/PATCH/DELETE и как задавать коды статусов ответа.
- Заголовки, cookies и формы
Как принимать HTTP-заголовки, cookies и данные форм в FastAPI через Header, Cookie и Form, и чем form-data отличается от JSON.
- Маршрутизация, теги и APIRouter
Организация маршрутов в больших проектах: APIRouter, префиксы, теги, разбиение на модули и подключение через include_router.
- Параметры пути и их валидация
3 Pydantic: модели и валидация
- Pydantic v2: модели и валидация данных
Что такое Pydantic-модели, как BaseModel валидирует и конвертирует данные, и что нового в Pydantic v2 с ядром на Rust.
- Field, ограничения и кастомные валидаторы
Тонкая настройка полей Pydantic через Field, ограничения значений, и кастомная валидация через field_validator и model_validator в v2.
- Response-модели и разделение входа и выхода
Зачем нужны response_model, как разделять модели входа и выхода, скрывать чувствительные поля и управлять сериализацией ответа.
- Вложенные модели, списки и опциональные поля
Вложенные Pydantic-модели, списки объектов, словари и опциональные поля; как FastAPI валидирует сложные структуры данных.
- Pydantic v2: модели и валидация данных
4 Зависимости (Dependency Injection)
- Dependency Injection и Depends
Что такое внедрение зависимостей в FastAPI, как работает Depends, зачем оно нужно и как переиспользовать общую логику между эндпоинтами.
- Зависимости с yield и управление ресурсами
Зависимости с yield в FastAPI: открытие и гарантированное закрытие ресурсов (сессий БД), аналогия с контекстным менеджером и порядок выполнения.
- Вложенные зависимости и зависимости класса
Зависимости, которые сами зависят от других, классы как зависимости, и зависимости уровня роутера и приложения.
- Dependency Injection и Depends
5 База данных, ошибки и безопасность
- Lifespan: запуск и остановка приложения
Жизненный цикл FastAPI-приложения через lifespan: подключение к БД при старте и закрытие при остановке, почему on_event устарел.
- Подключение базы данных через зависимости
Интеграция базы данных в FastAPI: сессия как зависимость с yield, паттерн создания engine в lifespan и работа с SQLAlchemy.
- Обработка ошибок и HTTPException
Как возвращать корректные ошибки в FastAPI: HTTPException, коды статусов, кастомные обработчики исключений и формат ответа об ошибке.
- Аутентификация: OAuth2, токены и JWT
Безопасность в FastAPI: OAuth2PasswordBearer, выдача и проверка JWT-токенов, хеширование паролей и защита эндпоинтов через зависимости.
- Lifespan: запуск и остановка приложения
6 Практика: продакшен-ready API
- Автодокументация: OpenAPI, Swagger и ReDoc
Как FastAPI генерирует OpenAPI-схему из типов и моделей, чем отличаются Swagger UI и ReDoc и как обогащать документацию метаданными.
- Middleware, CORS и фоновые задачи
Middleware для сквозной логики, настройка CORS для фронтенда и BackgroundTasks для отложенной работы после ответа в FastAPI.
- Тестирование FastAPI-приложений
Как тестировать FastAPI: TestClient, pytest, переопределение зависимостей через dependency_overrides и изоляция базы данных в тестах.
- Структура проекта и подготовка к продакшену
Как структурировать большой FastAPI-проект, настройки через переменные окружения, запуск в продакшене и развёртывание в Docker.
- Автодокументация: OpenAPI, Swagger и ReDoc
7 Асинхронность и конкурентность
- async def против def: когда какой
Когда писать роут как async def, а когда обычным def: как FastAPI запускает sync-обработчики в threadpool, почему блокирующий код в async-роуте — катастрофа, и про run_in_threadpool.
- Фоновые задачи: BackgroundTasks и когда нужен Celery
Когда использовать BackgroundTasks FastAPI для лёгкой работы после ответа, в чём её ограничения и когда пора выносить задачи в очередь и Celery или другой воркер.
- Конкурентность и event loop
Как один процесс FastAPI обслуживает тысячи запросов через event loop, что блокирует цикл и как ускорить независимые операции с помощью asyncio.gather.
- Потоковые ответы и WebSockets
Когда отдавать данные потоком: StreamingResponse для больших ответов, Server-Sent Events для односторонних обновлений и WebSocket для двунаправленной связи в FastAPI.
- async def против def: когда какой
8 Pydantic v2 вглубь
- Кастомная валидация: field_validator и model_validator
Кастомная валидация в Pydantic v2: декораторы field_validator и model_validator, режимы mode before/after, переиспользование проверок и AfterValidator через Annotated.
- Сериализация: model_dump, computed_field, алиасы
Сериализация в Pydantic v2: model_dump и model_dump_json, by_alias, exclude/include, вычисляемые поля computed_field и кастомные сериализаторы через field_serializer.
- Вложенные и обобщённые модели
Сложные структуры в Pydantic v2: вложенные модели и списки моделей, обобщённые (generic) модели с TypeVar и дискриминированные union по полю-тегу.
- Конфигурация: BaseSettings и model_config
Конфигурация приложения в Pydantic v2: pydantic-settings и BaseSettings, чтение настроек из переменных окружения и .env, model_config, строгий режим strict и frozen-модели.
- Кастомная валидация: field_validator и model_validator
9 Архитектура больших приложений
- APIRouter и структура проекта
Разбиение FastAPI на роутеры через APIRouter, префиксы и теги, структура папок большого приложения, include_router, общие зависимости и ответы на уровне роутера.
- Middleware и порядок обработки
Своя middleware в FastAPI, порядок выполнения (внешняя оборачивает внутренние), CORS и GZip, добавление заголовков и времени ответа X-Process-Time, отличие middleware от зависимостей.
- Зависимости вглубь: классы, yield, кэширование
Продвинутые зависимости FastAPI: классы как зависимости, yield для управления ресурсами БД, под-зависимости, кэширование в рамках запроса (use_cache) и подмена через dependency_overrides в тестах.
- Обработка ошибок: exception handlers
Обработка ошибок в FastAPI: HTTPException и заголовки, кастомные исключения, @app.exception_handler, перехват ошибок валидации RequestValidationError, единый формат ошибок для всего API.
- APIRouter и структура проекта
10 Тестирование и продакшен
- Тестирование FastAPI: TestClient и pytest
Как тестировать FastAPI: TestClient и pytest-фикстуры, подмена зависимостей через dependency_overrides, изолированная тестовая база данных и асинхронные тесты на httpx.
- Деплой: uvicorn, gunicorn, воркеры
Боевой деплой FastAPI: ASGI-сервер uvicorn, gunicorn с uvicorn-воркерами, сколько воркеров поднимать, запуск за обратным прокси nginx и контейнеризация в Docker.
- Производительность и кэширование
Производительность FastAPI: где узкие места, кэширование ответов в Redis, пул соединений к БД, профилирование запросов и почему async-код должен быть неблокирующим.
- Безопасность в проде
Оборонительная безопасность FastAPI в проде: правильный CORS по белому списку, security-заголовки, rate limiting, секреты через env и ограничение размера запроса.
- Тестирование FastAPI: TestClient и pytest