Полный практический курс по созданию production-ready API на FastAPI. От первых шагов до микросервисной архитектуры: асинхронность, базы данных, аутентификация, WebSocket, фоновые задачи, Docker, мониторинг и лучшие практики.
Цель: научиться проектировать, реализовывать и эксплуатировать production-ready API на FastAPI — от первого эндпоинта до микросервисной архитектуры с асинхронностью, аутентификацией и очередями задач.
Курс состоит из 30 последовательных тем. Основы вынесены вперёд, практика появляется после каждой темы, а материал старшего уровня собран в разделах про эксплуатацию и архитектуру. Пройти маршрут только запоминанием ответов недостаточно: каждая тема закрепляется исполняемой лабораторией с открытыми проверками.
Каждая тема читается в одном порядке: объяснение от базовых понятий к ограничениям, пошаговая практика и исполняемая лаборатория. Лаборатория переводит тему в задачу, приближенную к эксплуатации: студент получает заготовку с намеренно сломанным кодом и приводит её в рабочий вид, не меняя тесты.
Код навыка — это не тема и не балл за тест, а наблюдаемое умение. Уровень закрыт, когда студент предъявил перечисленный результат работы и может объяснить решения по рубрике.
FA-J1–FA-J3| Код | Проверяемое умение |
|---|---|
FA-J1 | Структура FastAPI-приложения: декораторы, lifespan, middleware |
FA-J2 | Валидация входных данных: Path/Query с ограничениями, Pydantic-модели |
FA-J3 | Pydantic v2 модели и response_model: model_config, ConfigDict, field validation |
Итоговая работа уровня: API управления товарами с валидацией, response_model, пагинацией и правильными статус-кодами.
FA-M1–FA-M2| Код | Проверяемое умение |
|---|---|
FA-M1 | API-дизайн и контракты: пагинация, фильтрация, статус-коды, разделение моделей |
FA-M2 | Безопасность ответов: response_model, extra='forbid', отсутствие утечки полей |
Итоговая работа уровня: API управления задачами с DI, кэш-aside с инвалидацией, background tasks и аутентификацией.
FA-S1–FA-S3| Код | Проверяемое умение |
|---|---|
FA-S1 | Асинхронные задачи и фоновая обработка: BackgroundTasks, Celery, retry, AsyncResult |
FA-S2 | Производительность и безопасность: N+1, пагинация, rate limiting, security headers, async patterns |
FA-S3 | Event-driven и интеграция: EventBus, idempotency, circuit breaker, GraphQL, serverless |
Итоговая работа уровня: API gateway для e-commerce с версионированием, агрегацией через gather+timeout, circuit breaker, EventBus и rate limiting.
Цель модуля — создать первое FastAPI-приложение, запустить его и освоить динамические маршруты с валидацией.
| № | Тема | Практическое доказательство |
|---|---|---|
| 1 | Введение в FastAPI | обзор фреймворка и окружения |
| 2 | Первые шаги | пинг-сервис с health-check и CORS |
| 3 | Параметры пути | каталог товаров с валидацией ID и slug |
Цель модуля — освоить request/response модели, обработку ошибок, dependency injection и работу с базой данных через SQLAlchemy 2.0.
| № | Тема | Практическое доказательство |
|---|---|---|
| 4 | Query-параметры | API задач с пагинацией и фильтрацией |
| 5 | Request body | создание пользователей с Pydantic v2 |
| 6 | Response model | API статей с фильтрацией полей |
| 7 | Обработка ошибок | доменные исключения и кастомные handlers |
| 8 | Dependency Injection | Depends, yield-зависимости, фильтрация по роли |
| 9 | Работа с базой данных | AsyncSession, Mapped/mapped_column, select |
| 10 | Продвинутый Pydantic | @field_validator, @model_validator, ConfigDict |
Цель модуля — реализовать аутентификацию, загрузку файлов, WebSocket, фоновые задачи и кэширование в production-приложении.
| № | Тема | Практическое доказательство |
|---|---|---|
| 11 | Аутентификация JWT | pwdlib Argon2, PyJWT, JWT с sub/exp/iat |
| 12 | OAuth2 | OAuth2PasswordBearer, tokenUrl, проверка scope |
| 13 | Загрузка файлов | UploadFile, MIME/размер, path traversal sanitization |
| 14 | WebSocket | WebSocket-чат с комнатами и broadcast |
| 15 | Фоновые задачи | BackgroundTasks, logging, 202 Accepted |
| 16 | Email и очереди задач | Celery, retry-стратегия, AsyncResult.state |
| 17 | Кэширование | cache-aside с TTL и инвалидацией |
| 18 | Middleware | тайминг, correlation ID, обработка ошибок |
Цель модуля — принимать измеримые инженерные решения для асинхронности, производительности, безопасности и деплоя.
| № | Тема | Практическое доказательство |
|---|---|---|
| 19 | Асинхронные паттерны | gather, TaskGroup, timeout, cancellation |
| 20 | Оптимизация производительности | N+1, пагинация, batch loading |
| 21 | Безопасность | rate limiting, CORS, security headers |
| 22 | Версионирование API | версионирование через APIRouter, deprecated |
| 23 | Документирование | OpenAPI, operation_id, tags, responses |
| 24 | Docker и деплой | multi-stage build, slim, non-root user |
| 25 | CI/CD и мониторинг | GitLab CI: stages, cache, artifacts |
Цель модуля — проектировать масштабируемые системы: микросервисы, event-driven, GraphQL и serverless.
| № | Тема | Практическое доказательство |
|---|---|---|
| 26 | Микросервисы | gateway, timeout, retry, circuit breaker |
| 27 | Event-driven архитектура | EventBus, idempotency key, key-based partitioning |
| 28 | GraphQL | Strawberry GraphQL, Query/Mutation, over-fetching |
| 29 | Serverless | Mangum, Lambda handler, cold start, lifespan="off" |
| 30 | Best practices | комплексный аудит: response_model, extra="forbid", статус-коды |
Двадцать девять тематических лабораторий и три итоговые работы уровня опубликованы в отдельном GitLab-проекте.
Материалы курса закреплены за веткой main, чтобы условие и проверки не
менялись во время выполнения работы.
В выпуск входят:
extra="forbid";response_model;Mapped/mapped_column, select, AsyncSession;@field_validator, @model_validator, ConfigDict;sub/exp/iat;tokenUrl, проверка scope;AsyncResult.state;Эталонные решения проходят 373 открытые проверки учебного контракта на CPython 3.12, 3.13 и 3.14. Открытые тесты — минимальный контракт, а не полная спецификация.
Не пытайтесь закрыть весь маршрут одним проходом. Сначала подтвердите основу, примените её в лаборатории, приближенной к эксплуатации, а затем возвращайтесь к архитектурным темам с вопросом: «какой контракт я действительно могу гарантировать в production?»
Современный высокопроизводительный веб-фреймворк для создания API на Python с автоматической генерацией OpenAPI-документации.
Пример
from fastapi import FastAPI
app = FastAPI()Связанные термины
ASGI-сервер для запуска FastAPI-приложений. Реализует асинхронный протокол ASGI.
Пример
uvicorn main:app --reload --host 0.0.0.0 --port 8000Связанные термины
Asynchronous Server Gateway Interface — асинхронная спецификация интерфейса между сервером и приложением. Пришла на смену WSGI.
Пример
ASGI позволяет обрабатывать WebSocket и long-polling запросы, что невозможно в WSGI.Связанные термины
Функция-обработчик, которая реагирует на определённый HTTP-метод и путь. Возвращает ответ клиенту.
Пример
@app.get('/users')
def get_users():
return []Связанные термины
Переменная часть URL-пути, которая передаётся в функцию как аргумент. Объявляется через фигурные скобки в декораторе.
Пример
@app.get('/users/{user_id}')
def get_user(user_id: int): ...Связанные термины
Параметр, передаваемый в строке запроса после знака вопроса. Используется для фильтрации, пагинации, сортировки.
Пример
/users?skip=0&limit=10&sort=nameСвязанные термины
Класс, наследующий BaseModel, который описывает структуру данных и правила валидации. Используется для request/response тел.
Пример
class UserCreate(BaseModel):
name: str
email: EmailStrСвязанные термины
Базовый класс Pydantic, от которого наследуются все модели данных. Обеспечивает валидацию и сериализацию.
Пример
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: floatСвязанные термины
Декоратор или функция в Pydantic, которая проверяет и/или преобразует значение поля перед присваиванием модели.
Пример
@field_validator('email')
@classmethod
def validate_email(cls, v):
if '@' not in v:
raise ValueError('Invalid email')
return vСвязанные термины
Декоратор Pydantic v2 для создания валидаторов полей. Заменяет validator из Pydantic v1.
Пример
from pydantic import field_validator
@field_validator('age')
@classmethod
def check_age(cls, v):
if v < 18:
raise ValueError('Must be adult')
return vСвязанные термины
Параметр декоратора path operation, который определяет схему ответа. FastAPI использует его для валидации и документирования.
Пример
@app.get('/users/{id}', response_model=UserResponse)
def get_user(id: int): ...Связанные термины
Параметр для скрытия полей в response model. Полезно для исключения чувствительных данных (пароли, токены).
Пример
@app.get('/users', response_model=UserOut, response_model_exclude={'password'})Связанные термины
ORM (Object-Relational Mapping) для Python. Позволяет работать с базой данных через Python-объекты.
Пример
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)Связанные термины
Object-Relational Mapping — техника программирования, связывающая объекты кода с таблицами базы данных.
Пример
SQLAlchemy, Django ORM, Tortoise ORM — примеры ORM в Python.Связанные термины
Объект SQLAlchemy, представляющий транзакцию с базой данных. Через сессию выполняются все операции CRUD.
Пример
with SessionLocal() as session:
user = session.execute(select(User)).scalars().first()
session.add(new_user)
session.commit()Связанные термины
Инструмент миграции баз данных для SQLAlchemy. Управляет версионированием схемы БД.
Пример
alembic revision --autogenerate -m 'Add users table'
alembic upgrade headСвязанные термины
Стандарт RFC 7519 для безопасной передачи информации между сторонами в виде JSON-объекта. Состоит из header, payload, signature.
Пример
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cСвязанные термины
Короткоживущий JWT-токен, используемый для аутентификации запросов. Передаётся в заголовке Authorization.
Пример
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Связанные термины
Долгоживущий токен для получения нового access token. Хранится безопасно (httpOnly cookie или secure storage).
Пример
POST /auth/refresh
{"refresh_token": "..."}Связанные термины
Протокол авторизации, позволяющий приложениям получать ограниченный доступ к аккаунтам пользователей через провайдеров (Google, GitHub).
Пример
OAuth2 flow: Authorization Code → Access Token → API RequestСвязанные термины
Схема HTTP-аутентификации, где токен передаётся в заголовке Authorization: Bearer <token>.
Пример
Authorization: Bearer my_secret_tokenСвязанные термины
Паттерн, при котором зависимости (сервисы, репозитории) передаются в объект извне, а не создаются внутри. В FastAPI реализуется через Depends.
Пример
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get('/users')
def read_users(db: Session = Depends(get_db)): ...Связанные термины
Функция FastAPI для объявления зависимостей. Вызывает функцию-зависимость и передаёт результат в обработчик.
Пример
from fastapi import Depends
def get_current_user(token: str = Depends(oauth2_scheme)): ...Связанные термины
Синтаксис Python для асинхронного программирования. async объявляет корутину, await приостанавливает выполнение до завершения операции.
Пример
async def fetch_data():
result = await db.query()
return resultСвязанные термины
Специализированная функция, которая может приостанавливать выполнение и возвращать управление event loop. Объявляется через async def.
Пример
async def my_coroutine():
await asyncio.sleep(1)
return 'done'Связанные термины
Цикл событий — ядро asyncio. Планирует и выполняет корутины, обрабатывает I/O операции неблокирующим способом.
Пример
asyncio.run(main()) # запускает event loopСвязанные термины
Протокол двусторонней связи поверх TCP. Позволяет серверу и клиенту обмениваться данными в реальном времени.
Пример
@app.websocket('/ws')
async def websocket_endpoint(ws: WebSocket):
await ws.accept()
await ws.send_text('Hello')Связанные термины
Задача, выполняемая после отправки ответа клиенту. Используется для операций, не требующих немедленного результата.
Пример
@app.post('/send-email')
async def send_email(background_tasks: BackgroundTasks):
background_tasks.add_task(send_email_task, email)
return {'status': 'queued'}Связанные термины
Распределённая очередь задач для Python. Используется для фоновой обработки тяжёлых задач (email, отчёты, обработка файлов).
Пример
@celery_app.task
def send_email(email: str):
smtp.send(email)Связанные термины
In-memory база данных, используемая для кэширования, очередей задач, сессий. Поддерживает структуры данных: строки, хэши, списки, сеты.
Пример
redis.set('key', 'value', ex=3600)
value = redis.get('key')Связанные термины
Функция, выполняющаяся до и после обработки запроса. Используется для логирования, CORS, аутентификации, rate limiting.
Пример
@app.middleware('http')
async def log_requests(request: Request, call_next):
print(f'{request.method} {request.url}')
response = await call_next(request)
return responseСвязанные термины
Cross-Origin Resource Sharing — механизм разрешения/запрета запросов с других доменов. Реализуется через middleware.
Пример
app.add_middleware(
CORSMiddleware,
allow_origins=['https://frontend.com'],
allow_credentials=True,
allow_methods=['*'],
allow_headers=['*'],
)Связанные термины
Ограничение количества запросов от одного клиента за единицу времени. Защита от DDoS и злоупотреблений.
Пример
slowapi = SlowAPI()
app.state.limiter = slowapi
@app.get('/api')
@limiter.limit('5/minute')
def api_endpoint(): ...Связанные термины
Спецификация для описания REST API. FastAPI автоматически генерирует OpenAPI-схму на основе аннотаций типов.
Пример
FastAPI создаёт /openapi.json — полная спецификация API в формате OpenAPI 3.0Связанные термины
Интерактивная документация API, доступная по /docs в FastAPI. Позволяет тестировать эндпоинты прямо из браузера.
Пример
Откройте http://localhost:8000/docs для просмотра Swagger UIСвязанные термины
Платформа контейнеризации. Упаковывает приложение со всеми зависимостями в изолированный контейнер.
Пример
FROM python:3.11-slim
COPY . /app
RUN pip install -r requirements.txt
CMD ['uvicorn', 'main:app', '--host', '0.0.0.0']Связанные термины
Инструмент для оркестрации многоконтейнерных приложений. Описывает сервисы, сети, volumes в YAML-файле.
Пример
version: '3.8'
services:
api:
build: .
ports: ['8000:8000']
db:
image: postgres:15Связанные термины
Архитектурный паттерн, где приложение состоит из небольших независимых сервисов, общающихся через API.
Пример
Сервисы: users-service, orders-service, payments-service, notifications-serviceСвязанные термины
Единая точка входа для клиентов, маршрутизирующая запросы к соответствующим микросервисам. Может включать аутентификацию, rate limiting, кэширование.
Пример
Kong, Traefik, AWS API Gateway, NginxСвязанные термины
Архитектурный паттерн, где сервисы общаются через события (events). Производитель публикует событие, потребители реагируют.
Пример
OrderCreated → [Payment Service] → PaymentProcessed → [Notification Service] → EmailSentСвязанные термины
Распределённая платформа потоковой обработки событий. Используется для event-driven архитектуры, логов, аналитики.
Пример
from aiokafka import AIOKafkaProducer
producer = AIOKafkaProducer(bootstrap_servers='localhost:9092')
await producer.send('orders', b'{"order_id": 123}')Связанные термины
Язык запросов для API, позволяющий клиенту запрашивать только нужные данные. Альтернатива REST.
Пример
query {
user(id: 1) {
name
email
posts { title }
}
}Связанные термины
Система мониторинга и сбора метрик. Pull-модель: Prometheus опрашивает эндпоинты приложений и сохраняет метрики.
Пример
@app.get('/metrics')
def metrics():
return generate_latest()Связанные термины
Платформа визуализации метрик. Подключается к Prometheus и отображает дашборды с графиками.
Пример
Дашборд: Request rate, Error rate, P95 latency, CPU usageСвязанные термины
Модель выполнения, где провайдер управляет инфраструктурой. Код выполняется в ответ на события (AWS Lambda, Cloud Functions).
Пример
AWS Lambda + API Gateway: функция запускается только при HTTP-запросеСвязанные термины
Состав курса, уровни, практика и способы проверки знаний.
Курс включает 30 тем и 360 вопросов с разбором ответа, а также 29 тематических лабораторных работ. Начать можно с первой темы курса.
Маршрут охватывает уровни Junior, Middle, Senior. Темы расположены от основы к более сложным инженерным задачам, поэтому можно начать с подходящего места и не пропускать важные зависимости.
На вкладке «Практика» доступно 29 заданий и 3 итоговые работы для подтверждения уровня. Решение выполняется в своём Git-репозитории и отправляется ссылкой на конкретный коммит. Открыть практику курса.
После прохождения тем доступен зачёт по курсу «FastAPI Pro: От новичка до архитектора» — 20 случайных вопросов с порогом 80%. После зачёта открывается экзамен с развёрнутыми ответами и автоматической оценкой, приближённый к техническому собеседованию.
Да, курс полностью бесплатный: все 30 тем доступны без оплаты.