Подробнее
Что нужно для старта
- Чтобы курс не оказался слишком сложным, желательно иметь:
- Уверенное знание базового Python: переменные, функции, классы, импорты, работа со списками и словарями
- Базовое представление о том, что такое веб-сервис и HTTP (запрос/ответ)
- Готовность установить Docker и работать в редакторе кода (в курсе используется VS Code)
- Предварительный опыт с FastAPI, базами данных, async и тестами не требуется — всему этому мы учимся с нуля внутри курса
Что вы получите
- Разрабатывать REST API на FastAPI с валидацией через Pydantic v2 и автоматической OpenAPI/Swagger-документацией
- Проектировать схему базы данных и вести её эволюцию через миграции Alembic, пройдя путь от списка в памяти к SQLite и затем к асинхронному PostgreSQL (asyncpg + SQLAlchemy 2.0)
- Реализовывать аутентификацию и авторизацию: хэширование паролей через bcrypt, JWT-токены, роли и контроль доступа через Depends
- Писать юнит- и интеграционные тесты на pytest и httpx с изоляцией тестов и собственной тестовой базой
- Работать с файловым хранилищем S3 через aioboto3 и каскадной чисткой через события SQLAlchemy
- Строить версионирование API (v1/v2), пагинацию, фильтры, аудит-логирование действий и модуль поддержки пользователей
- Поднимать всё окружение (приложение + PostgreSQL + MinIO) одной командой через Docker Compose
Для кого этот курс
- Курс предназначен для тех, кто уже знаком с основами Python (функции, классы, синтаксис), но ещё не писал настоящих веб-сервисов. Это подходит, если вы прошли вводные курсы или туториалы, устали от бесконечных «Hello World» и хотите увидеть, как строится хотя бы базовая архитектура реального сервиса. Также курс будет полезен тем, кто делает первые уверенные шаги в backend, хочет усилить портфолио настоящим проектом или подготовиться к собеседованию на junior-позицию. Он не рассчитан на тех, кто ещё не освоил базу языка, и на опытных backend-разработчиков с многолетним стажем на Python и FastAPI в частности
Программа курса
- Python–старт
- Теория ключевых аспектов
- Есть вопросик...
- Инициализация проекта в VS Code
- От def к async def
- Техническое задание на сервис
- Первый эндпоинт со списком товаров
- Аннотации типов для PRODUCTS
- Получение товара по ID и обработка 404
- Поиск товаров по тексту
- Фильтр товаров по категории
- Самостоятельная работа: фильтр по диапазону цен
- Создание товара через POST
- Ручная валидация полей в POST
- Сбор всех ошибок валидации в одном ответе
- Пример тела запроса в Swagger
- Полная замена товара через PUT
- Удаление товара через DELETE
- От example к examples в OpenAPI
- Подготовка: Pydantic v2 в зависимостях
- Pydantic-модели ProductBase и Product
- response_model и доступ через точку в GET
- Field-валидация и ProductCreate в POST
- Самостоятельная работа: Pydantic в PUT
- Доступ через точку в DELETE
- Рефакторинг
- Кастомные русские сообщения об ошибках
- Локализация ошибки product_id
- Рефакторинг: выносим приложение в пакет app
- Pydantic-схемы — в app/schemas.py
- Обработка ошибок — в app/errors.py
- Зачем нужны базы данных
- Установка и настройка окружения для работы с SQLite
- Основные концепции структуры базы данных
- Отношения в базе данных
- Что такое SQL и система типов
- Создание таблиц
- Ограничения SQL
- Добавление записей
- Самостоятельная работа: наполнение данными
- Выборка данных
- Фильтрация данных
- Оператор обновления данных
- Самостоятельная работа на обновление данных
- Оператор удаления данных
- Самостоятельная работа: создание и наполнение базы данных
- Сложные концепции
- Самостоятельная работа на сложные запросы
- Сложные запросы
- Самостоятельная работа на объединение
- Подключаем SQLite через SQLAlchemy
- Асинхронная настройка SQLAlchemy
- Инициализация БД и lifespan FastAPI
- Клиенты для работы с БД и .gitignore
- Сидирование БД начальными данными
- Репозиторий и dependency injection
- Получение списка продуктов из БД
- Получение по id и функция ensure_found
- Поиск с пользовательской SQL-функцией PY_LOWER
- Фильтр по категории через PY_LOWER
- Фильтр по диапазону цен через BETWEEN и COALESCE
- Обновление товара через репозиторий
- Удаление через репозиторий и финал перехода
- Уникальность имени и IntegrityError → 409 Conflict
- ORM-модель ProductORM на DeclarativeBase
- Инициализация схемы через ORM-модель
- Seed на ORM с проверкой «уже сидировано»
- list_all через select() и from_attributes
- get_by_id через session.get
- Создание товара через session.add и refresh
- Обновление через setattr и dirty-tracking
- Унификация возвращаемых типов через model_validate
- Удаление через ORM с возвратом сущности
- Поиск на SQLAlchemy Core: select, or_, func
- Фильтры по категории и цене на ORM-запросах
- Подведение итогов: текущее состояние сервиса
- APIRouter и модульная регистрация маршрутов
- Вынос продуктовых эндпоинтов в отдельный роутер
- ORM-модели пользователей и ролей
- Сидирование admin-пользователя и привязка товаров
- Схемы и каркас репозитория пользователей
- Реализация методов UserRepository
- Регистрация пользователей через роутер auth
- JWT-токены: теория аутентификации
- Создание и проверка JWT через PyJWT
- Логин и OAuth2PasswordRequestForm
- get_current_user и CurrentUser-зависимость
- Первый защищённый эндпоинт: search
- Проверка владельца и роли в продуктовых эндпоинтах
- Хеширование паролей через bcrypt
- Роутер users и эндпоинт /users/me
- Смена пароля через PATCH /users/me/password
- AdminUser-зависимость и список пользователей
- Активация и деактивация пользователей
- AuditLog: модель, репозиторий, схема
- Аудит-логирование через отдельный сервис
- Эндпоинты просмотра аудита
- Теория
- ORM-listener'ы и ContextVar для actor_id
- HTTP middleware для actor_id
- Уборка явных вызовов audit.record
- Аудит изменений продуктов через ORM events
- Подготовка к переезду на PostgreSQL: установка Docker
- Экспресс-погружение в Docker
- docker-compose.yml с PostgreSQL
- Переезд на PostgreSQL через asyncpg
- Нормализация поиска через lower и replace для Postgres
- Dockerfile для приложения
- Pydantic Settings и переменные окружения
- SECRET_KEY и TTL токена в env-переменных
- ADMIN_PASSWORD в переменных окружения
- FastAPI в Compose рядом с Postgres
- Compose-профили dev и prod
- Makefile: алиасы для частых команд
- Миграции схемы БД: зачем нужны
- Установка Alembic и структура миграций
- env.py: метаданные моделей и URL из Settings
- Первая миграция: init schema
- Запуск миграций на старте приложения
- Поле created_at и автогенерация миграции
- Переименование колонки и почему Alembic его «не видит»
- Alembic в Dockerfile и команды миграций в Makefile
- pytest: первая инфраструктура тестов
- Формы assert и измерение покрытия
- Первые «живые» тесты — модуль security
- А что, если ты тестировщик: анализ граничных значений
- FastAPI TestClient: API-тест без поднятия сервера
- Async-тесты в pytest и режим asyncio_mode = "auto"
- Тестируем Pydantic-схему: фикстуры и валидация
- Отдельный тестовый Postgres в docker-compose
- conftest.py: тестовый engine, sessionmaker и session
- Проверка изоляции тестов между прогонами
- AsyncClient и override зависимостей FastAPI
- Интеграционный тест GET /products
- Версионирование API через префикс /api/v1
- Генератор тестовых продуктов на Faker
- Подключаем фабрику к seed_db и упираемся в
- Хранилище картинок: S3, MinIO и aioboto3
- S3-настройки и async-обёртка S3Storage
- ensure_bucket: автосоздание S3-бакета при старте
- Публичная политика чтения S3-бакета
- ProductImageORM: модель картинки и связь 1-к-1
- Сидинг placeholder в S3 и в product_image
- Универсальная пагинация: Page[T] и PageParams
- v2-поиск по имени и описанию с пагинацией
- v2-роутер продуктов и пагинированный list
- v2-фильтрация по категории с пагинацией
- v2-фильтрация по цене с опциональными границами
- Эндпоинт картинки товара
- put_object и delete_object в S3Storage
- upsert_image и delete_image в репозитории
- POST и DELETE для картинки товара
- Проблема: удалённые товары оставляют картинки в S3
- Каркас модуля поддержки: пакет app/support
- SupportStatus и SenderRole: enum-ы для поддержки
- ConversationORM: модель диалога поддержки
- ConversationMessageORM
- Индексы и миграция для таблиц поддержки
- Связь с админом и Pydantic-схемы модуля поддержки
- SupportRepository: каркас и методы чтения
- SupportRepository: остальные методы репозитория
- Пользовательский роутер поддержки и создание обращения
- Пагинированный список обращений пользователя
- Просмотр обращения и проверка владельца
- Отправка сообщения в обращение
- Отметка обращения как прочитанного
- Админский роутер: список всех обращений
- Счётчики обращений для админки
- Просмотр любого обращения админом
- Ответ админа на обращение
- Закрытие обращения: владелец или админ
- Флаг featured для продуктов
- Выборка избранных товаров с добивкой случайными
- Публичный endpoint избранных товаров
- Категории с количеством товаров (агрегация)
- Расширение seed: реальные картинки товаров
- CORS: пускаем фронтенд к API
- Возможно, тут появится продолжение...
01Первые шаги
- Python–старт
02Основы REST API и HTTP (общая теория)
- Теория ключевых аспектов
- Есть вопросик...
03Первое приложение на FastAPI
- Инициализация проекта в VS Code
- От def к async def
- Техническое задание на сервис
- Первый эндпоинт со списком товаров
- Аннотации типов для PRODUCTS
- Получение товара по ID и обработка 404
- Поиск товаров по тексту
- Фильтр товаров по категории
- Самостоятельная работа: фильтр по диапазону цен
04CRUD: создание, обновление и удаление товаров
- Создание товара через POST
- Ручная валидация полей в POST
- Сбор всех ошибок валидации в одном ответе
- Пример тела запроса в Swagger
- Полная замена товара через PUT
- Удаление товара через DELETE
- От example к examples в OpenAPI
- Подготовка: Pydantic v2 в зависимостях
05Pydantic, обработка ошибок и структура проекта
- Pydantic-модели ProductBase и Product
- response_model и доступ через точку в GET
- Field-валидация и ProductCreate в POST
- Самостоятельная работа: Pydantic в PUT
- Доступ через точку в DELETE
- Рефакторинг
- Кастомные русские сообщения об ошибках
- Локализация ошибки product_id
- Рефакторинг: выносим приложение в пакет app
- Pydantic-схемы — в app/schemas.py
- Обработка ошибок — в app/errors.py
06Основы баз данных и SQL (общая теория)
- Зачем нужны базы данных
- Установка и настройка окружения для работы с SQLite
- Основные концепции структуры базы данных
- Отношения в базе данных
- Что такое SQL и система типов
- Создание таблиц
- Ограничения SQL
- Добавление записей
- Самостоятельная работа: наполнение данными
- Выборка данных
- Фильтрация данных
- Оператор обновления данных
- Самостоятельная работа на обновление данных
- Оператор удаления данных
- Самостоятельная работа: создание и наполнение базы данных
- Сложные концепции
- Самостоятельная работа на сложные запросы
- Сложные запросы
- Самостоятельная работа на объединение
07База данных SQLite и слой репозитория
- Подключаем SQLite через SQLAlchemy
- Асинхронная настройка SQLAlchemy
- Инициализация БД и lifespan FastAPI
- Клиенты для работы с БД и .gitignore
- Сидирование БД начальными данными
- Репозиторий и dependency injection
- Получение списка продуктов из БД
- Получение по id и функция ensure_found
- Поиск с пользовательской SQL-функцией PY_LOWER
- Фильтр по категории через PY_LOWER
- Фильтр по диапазону цен через BETWEEN и COALESCE
- Обновление товара через репозиторий
- Удаление через репозиторий и финал перехода
- Уникальность имени и IntegrityError → 409 Conflict
08Переход на SQLAlchemy ORM
- ORM-модель ProductORM на DeclarativeBase
- Инициализация схемы через ORM-модель
- Seed на ORM с проверкой «уже сидировано»
- list_all через select() и from_attributes
- get_by_id через session.get
- Создание товара через session.add и refresh
- Обновление через setattr и dirty-tracking
- Унификация возвращаемых типов через model_validate
- Удаление через ORM с возвратом сущности
- Поиск на SQLAlchemy Core: select, or_, func
- Фильтры по категории и цене на ORM-запросах
- Подведение итогов: текущее состояние сервиса
09Модуль 6. Модульные роутеры и пользователи
- APIRouter и модульная регистрация маршрутов
- Вынос продуктовых эндпоинтов в отдельный роутер
- ORM-модели пользователей и ролей
- Сидирование admin-пользователя и привязка товаров
- Схемы и каркас репозитория пользователей
- Реализация методов UserRepository
- Регистрация пользователей через роутер auth
10Аутентификация и авторизация: JWT и роли
- JWT-токены: теория аутентификации
- Создание и проверка JWT через PyJWT
- Логин и OAuth2PasswordRequestForm
- get_current_user и CurrentUser-зависимость
- Первый защищённый эндпоинт: search
- Проверка владельца и роли в продуктовых эндпоинтах
- Хеширование паролей через bcrypt
- Роутер users и эндпоинт /users/me
- Смена пароля через PATCH /users/me/password
- AdminUser-зависимость и список пользователей
- Активация и деактивация пользователей
11Аудит действий через event listeners
- AuditLog: модель, репозиторий, схема
- Аудит-логирование через отдельный сервис
- Эндпоинты просмотра аудита
- Теория
- ORM-listener'ы и ContextVar для actor_id
- HTTP middleware для actor_id
- Уборка явных вызовов audit.record
- Аудит изменений продуктов через ORM events
12Переезд на PostgreSQL и Docker
- Подготовка к переезду на PostgreSQL: установка Docker
- Экспресс-погружение в Docker
- docker-compose.yml с PostgreSQL
- Переезд на PostgreSQL через asyncpg
- Нормализация поиска через lower и replace для Postgres
- Dockerfile для приложения
- Pydantic Settings и переменные окружения
- SECRET_KEY и TTL токена в env-переменных
- ADMIN_PASSWORD в переменных окружения
- FastAPI в Compose рядом с Postgres
- Compose-профили dev и prod
- Makefile: алиасы для частых команд
13Миграции схемы через Alembic
- Миграции схемы БД: зачем нужны
- Установка Alembic и структура миграций
- env.py: метаданные моделей и URL из Settings
- Первая миграция: init schema
- Запуск миграций на старте приложения
- Поле created_at и автогенерация миграции
- Переименование колонки и почему Alembic его «не видит»
- Alembic в Dockerfile и команды миграций в Makefile
14Тестирование: от юнитов до интеграционных тестов
- pytest: первая инфраструктура тестов
- Формы assert и измерение покрытия
- Первые «живые» тесты — модуль security
- А что, если ты тестировщик: анализ граничных значений
- FastAPI TestClient: API-тест без поднятия сервера
- Async-тесты в pytest и режим asyncio_mode = "auto"
- Тестируем Pydantic-схему: фикстуры и валидация
- Отдельный тестовый Postgres в docker-compose
- conftest.py: тестовый engine, sessionmaker и session
- Проверка изоляции тестов между прогонами
- AsyncClient и override зависимостей FastAPI
- Интеграционный тест GET /products
15Версионирование API и генерация тестовых данных
- Версионирование API через префикс /api/v1
- Генератор тестовых продуктов на Faker
- Подключаем фабрику к seed_db и упираемся в
16Хранилище файлов: S3, MinIO и модель изображений
- Хранилище картинок: S3, MinIO и aioboto3
- S3-настройки и async-обёртка S3Storage
- ensure_bucket: автосоздание S3-бакета при старте
- Публичная политика чтения S3-бакета
- ProductImageORM: модель картинки и связь 1-к-1
- Сидинг placeholder в S3 и в product_image
17Пагинация и API v2
- Универсальная пагинация: Page[T] и PageParams
- v2-поиск по имени и описанию с пагинацией
- v2-роутер продуктов и пагинированный list
- v2-фильтрация по категории с пагинацией
- v2-фильтрация по цене с опциональными границами
18Загрузка и управление изображениями товаров
- Эндпоинт картинки товара
- put_object и delete_object в S3Storage
- upsert_image и delete_image в репозитории
- POST и DELETE для картинки товара
- Проблема: удалённые товары оставляют картинки в S3
19Модуль 16. Модуль поддержки пользователей — итоговый проект
- Каркас модуля поддержки: пакет app/support
- SupportStatus и SenderRole: enum-ы для поддержки
- ConversationORM: модель диалога поддержки
- ConversationMessageORM
- Индексы и миграция для таблиц поддержки
- Связь с админом и Pydantic-схемы модуля поддержки
- SupportRepository: каркас и методы чтения
- SupportRepository: остальные методы репозитория
- Пользовательский роутер поддержки и создание обращения
- Пагинированный список обращений пользователя
- Просмотр обращения и проверка владельца
- Отправка сообщения в обращение
- Отметка обращения как прочитанного
- Админский роутер: список всех обращений
- Счётчики обращений для админки
- Просмотр любого обращения админом
- Ответ админа на обращение
- Закрытие обращения: владелец или админ
20Публичный API и финальные штрихи
- Флаг featured для продуктов
- Выборка избранных товаров с добивкой случайными
- Публичный endpoint избранных товаров
- Категории с количеством товаров (агрегация)
- Расширение seed: реальные картинки товаров
- CORS: пускаем фронтенд к API
21Что дальше
- Возможно, тут появится продолжение...
Отзывы о курсе
Оставьте отзыв
Расскажите о качестве обучения, поддержке и результате. Это поможет другим выбрать организацию осознанно.
Оставьте заявку
Консультант ответит на вопросы о курсе «Python: Антикризисный FastAPI» и поможет разобраться в деталях обучения.
Нажимая кнопку, вы даете согласие на обработку персональных данных
Информация обновлена 7 сентября 2026 г.

Stepik 



















