Каталог библиотек Python/FastAPI
Версия: 1.0.0
Дата: 2025-12-20
Назначение: Справочник для Проектора и Кодера
ИЕРАРХИЯ КАТЕГОРИЙ
УРОВЕНЬ 0: ЯДРО
├── 0.1 Фреймворк
├── 0.2 Сервер
└── 0.3 Конфигурация
УРОВЕНЬ 1: ДАННЫЕ
├── 1.1 ORM / База данных
├── 1.2 Миграции
├── 1.3 Валидация
├── 1.4 Сериализация
└── 1.5 Кэширование
УРОВЕНЬ 2: БЕЗОПАСНОСТЬ
├── 2.1 Хеширование паролей
├── 2.2 JWT токены
├── 2.3 OAuth2
└── 2.4 CORS / Security headers
УРОВЕНЬ 3: БИЗНЕС-ЛОГИКА
├── 3.1 Фоновые задачи
├── 3.2 Планировщик
├── 3.3 Очереди сообщений
└── 3.4 State machines
УРОВЕНЬ 4: ИНТЕГРАЦИИ
├── 4.1 HTTP клиент
├── 4.2 Email
├── 4.3 SMS
├── 4.4 Платежи
└── 4.5 Внешние API
УРОВЕНЬ 5: ФАЙЛЫ
├── 5.1 Файловая система
├── 5.2 S3 / Облако
├── 5.3 Изображения
├── 5.4 Excel / CSV
└── 5.5 PDF
УРОВЕНЬ 6: REAL-TIME
├── 6.1 WebSocket
├── 6.2 SSE
└── 6.3 Pub/Sub
УРОВЕНЬ 7: UI / FRONTEND
├── 7.1 Шаблоны
├── 7.2 Статика
└── 7.3 Админка
УРОВЕНЬ 8: ТЕСТИРОВАНИЕ
├── 8.1 Фреймворк
├── 8.2 Моки
├── 8.3 Фикстуры
└── 8.4 Покрытие
УРОВЕНЬ 9: OBSERVABILITY
├── 9.1 Логирование
├── 9.2 Метрики
├── 9.3 Трейсинг
└── 9.4 Профилирование
УРОВЕНЬ 10: ИНФРАСТРУКТУРА
├── 10.1 Контейнеризация
├── 10.2 ASGI сервер
├── 10.3 Reverse proxy
└── 10.4 CI/CD
УРОВЕНЬ 11: DEV TOOLS
├── 11.1 Линтер
├── 11.2 Форматтер
├── 11.3 Type checker
└── 11.4 Package manager
УРОВЕНЬ 0: ЯДРО
0.1 Фреймворк
| Библиотека |
Статус |
Почему |
| FastAPI |
✅ СТАНДАРТ |
Async native, автодокументация, type hints, скорость |
| Flask |
❌ НЕТ |
Sync, нет автодокументации, устаревший подход |
| Django |
❌ НЕТ |
Монолит, другая философия, медленнее |
| Starlette |
⚠️ Если нужен минимум |
Основа FastAPI, но без валидации |
# Почему FastAPI:
# 1. В 10-20x быстрее Django/Flask
# 2. Автоматическая OpenAPI документация
# 3. Валидация через Pydantic
# 4. Async из коробки
# 5. Type hints = меньше багов
from fastapi import FastAPI
app = FastAPI()
0.2 ASGI Сервер
| Библиотека |
Статус |
Почему |
| uvicorn |
✅ СТАНДАРТ |
Быстрый, async, от автора Starlette |
| gunicorn + uvicorn |
✅ PRODUCTION |
Менеджер процессов + uvicorn workers |
| hypercorn |
⚠️ Альтернатива |
HTTP/2, но менее популярен |
| daphne |
❌ НЕТ |
Для Django Channels |
# Development
uvicorn app.main:app --reload
# Production
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker
Почему gunicorn + uvicorn:
- gunicorn управляет процессами (перезапуск при падении)
- uvicorn обрабатывает async запросы
- Вместе = надёжность + скорость
0.3 Конфигурация
| Библиотека |
Статус |
Почему |
| pydantic-settings |
✅ СТАНДАРТ |
Type-safe, валидация, .env поддержка |
| python-dotenv |
✅ Вместе с pydantic |
Загрузка .env файлов |
| dynaconf |
⚠️ Сложные случаи |
Много источников, environments |
| os.environ |
❌ НЕТ |
Нет валидации, строки везде |
# Почему pydantic-settings:
# 1. Валидация типов (int, bool, URL)
# 2. Значения по умолчанию
# 3. Документация настроек
# 4. Интеграция с FastAPI
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
database_url: str
debug: bool = False
api_key: str
class Config:
env_file = ".env"
settings = Settings() # Автоматически загрузит из .env
УРОВЕНЬ 1: ДАННЫЕ
1.1 ORM / База данных
SQL
| Библиотека |
Статус |
Почему |
| SQLAlchemy 2.0 async |
✅ СТАНДАРТ |
Мощный, гибкий, async native в v2 |
| SQLModel |
⚠️ Простые случаи |
SQLAlchemy + Pydantic, меньше кода |
| SQLAlchemy 1.x |
❌ НЕТ |
Legacy, нет native async |
| Django ORM |
❌ НЕТ |
Только для Django |
| Tortoise ORM |
⚠️ Альтернатива |
Async, Django-like синтаксис |
# Почему SQLAlchemy 2.0:
# 1. Async native (не через greenlet)
# 2. Гибкий query builder
# 3. Поддержка всех БД
# 4. Type hints
# 5. Огромное сообщество
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
email: Mapped[str] = mapped_column(unique=True)
NoSQL
| Библиотека |
Статус |
Почему |
| Beanie |
✅ MongoDB |
Async ODM, Pydantic модели |
| Motor |
✅ MongoDB driver |
Async драйвер для MongoDB |
| redis-py (async) |
✅ Redis |
Async поддержка |
| PyMongo |
❌ НЕТ |
Sync, блокирует |
# Почему Beanie для MongoDB:
# 1. Pydantic модели = валидация
# 2. Async native
# 3. Миграции из коробки
from beanie import Document
class User(Document):
email: str
name: str
class Settings:
collection = "users"
Драйверы
| База |
Драйвер |
Почему |
| PostgreSQL |
asyncpg |
Самый быстрый async драйвер |
| PostgreSQL (sync) |
psycopg3 |
Современный sync |
| MySQL |
aiomysql |
Async для MySQL |
| SQLite |
aiosqlite |
Async для SQLite |
1.2 Миграции
| Библиотека |
Статус |
Почему |
| Alembic |
✅ СТАНДАРТ |
Мощный, автогенерация, откат |
| aerich |
⚠️ Для Tortoise |
Только с Tortoise ORM |
| Ручной SQL |
❌ НЕТ |
Нет версионирования, опасно |
# Почему Alembic:
# 1. Автогенерация миграций из моделей
# 2. Откат (downgrade)
# 3. Версионирование
# 4. Работает с SQLAlchemy
# Команды:
# alembic init alembic
# alembic revision --autogenerate -m "add users"
# alembic upgrade head
# alembic downgrade -1
1.3 Валидация
| Библиотека |
Статус |
Почему |
| Pydantic v2 |
✅ СТАНДАРТ |
Быстрый, интеграция с FastAPI |
| Pydantic v1 |
❌ НЕТ |
Deprecated, медленнее |
| marshmallow |
❌ НЕТ |
Для Flask, нет type hints |
| attrs |
⚠️ Простые случаи |
Быстрый, но нет сериализации |
| dataclasses |
⚠️ Внутренние модели |
Нет валидации |
# Почему Pydantic v2:
# 1. В 5-50x быстрее v1
# 2. Type hints = документация
# 3. Автоматическая валидация в FastAPI
# 4. JSON Schema генерация
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
email: EmailStr
password: str = Field(min_length=8)
age: int = Field(ge=18, le=120)
1.4 Сериализация
| Библиотека |
Статус |
Почему |
| orjson |
✅ СТАНДАРТ |
В 10x быстрее stdlib json |
| ujson |
⚠️ Альтернатива |
Быстрый, но меньше фич |
| json (stdlib) |
⚠️ Совместимость |
Если нужна 100% совместимость |
| msgpack |
⚠️ Бинарный |
Компактнее JSON, для внутренних API |
# Почему orjson:
# 1. В 10x быстрее stdlib
# 2. Поддержка datetime, UUID, numpy
# 3. Строгий (не сериализует что попало)
import orjson
data = {"name": "test", "created": datetime.now()}
json_bytes = orjson.dumps(data) # bytes
json_str = json_bytes.decode() # str
1.5 Кэширование
| Библиотека |
Статус |
Почему |
| Redis (redis-py async) |
✅ СТАНДАРТ |
Быстрый, персистентный, pub/sub |
| aiocache |
⚠️ Абстракция |
Единый API для разных бэкендов |
| cachetools |
⚠️ In-memory |
Локальный кэш, TTL |
| memcached |
❌ НЕТ |
Redis лучше по функционалу |
# Почему Redis:
# 1. Персистентность (данные не теряются)
# 2. Pub/Sub для real-time
# 3. Структуры данных (lists, sets, hashes)
# 4. Кластеризация
import redis.asyncio as redis
r = redis.from_url("redis://localhost")
await r.set("key", "value", ex=3600) # TTL 1 час
value = await r.get("key")
УРОВЕНЬ 2: БЕЗОПАСНОСТЬ
2.1 Хеширование паролей
| Библиотека |
Статус |
Почему |
| passlib + bcrypt |
✅ СТАНДАРТ |
Безопасный, проверенный |
| bcrypt |
⚠️ Напрямую |
Если не нужна абстракция passlib |
| argon2-cffi |
⚠️ Альтернатива |
Новее bcrypt, победитель PHC |
| hashlib |
❌ НЕТ |
Не для паролей (нет salt, быстрый) |
# Почему passlib:
# 1. Абстракция над алгоритмами
# 2. Автоматический upgrade хешей
# 3. Проверенный в production
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
hashed = pwd_context.hash("password123")
is_valid = pwd_context.verify("password123", hashed)
2.2 JWT токены
| Библиотека |
Статус |
Почему |
| python-jose |
✅ СТАНДАРТ |
Полная поддержка JOSE, криптография |
| PyJWT |
⚠️ Альтернатива |
Проще, но меньше алгоритмов |
| authlib |
⚠️ Полный OAuth |
Если нужен полный OAuth стек |
# Почему python-jose:
# 1. Поддержка RSA, EC ключей
# 2. JWS, JWE, JWK
# 3. Рекомендован FastAPI
from jose import jwt
token = jwt.encode({"sub": user_id}, SECRET_KEY, algorithm="HS256")
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
2.3 OAuth2
| Библиотека |
Статус |
Почему |
| FastAPI Security |
✅ Встроенный |
OAuth2 схемы из коробки |
| fastapi-users |
✅ Готовое решение |
Полный auth из коробки |
| authlib |
⚠️ Кастомный OAuth |
OAuth провайдер, клиент |
# FastAPI встроенный OAuth2:
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@app.post("/token")
async def login(form: OAuth2PasswordRequestForm = Depends()):
# Проверка, выдача токена
pass
@app.get("/protected")
async def protected(token: str = Depends(oauth2_scheme)):
# Защищённый endpoint
pass
УРОВЕНЬ 3: БИЗНЕС-ЛОГИКА
3.1 Фоновые задачи
| Библиотека |
Статус |
Когда |
Почему |
| BackgroundTasks |
✅ Простые |
< 5 сек, fire-and-forget |
Встроенный в FastAPI |
| ARQ |
✅ I/O задачи |
HTTP, email, файлы |
Async native, Redis |
| Celery |
✅ CPU задачи |
Расчёты, обработка |
Надёжный, масштабируемый |
| Dramatiq |
⚠️ Альтернатива Celery |
Проще Celery |
Хорошие defaults |
| Huey |
⚠️ Лёгкий вариант |
Простые задачи |
Минималистичный |
| RQ |
❌ НЕТ |
— |
Медленный |
ДЕРЕВО ВЫБОРА:
Задача < 5 сек, не критична?
├── ДА → BackgroundTasks
│
└── НЕТ → Нужен retry/статус?
├── НЕТ → BackgroundTasks
│
└── ДА → I/O или CPU?
├── I/O → ARQ
└── CPU → Celery
# BackgroundTasks (простое)
from fastapi import BackgroundTasks
@app.post("/send-email")
async def send(bg: BackgroundTasks):
bg.add_task(send_email, "user@example.com")
return {"status": "queued"}
# ARQ (async задачи)
async def send_email(ctx, email: str):
await smtp.send(email)
class WorkerSettings:
functions = [send_email]
redis_settings = RedisSettings()
3.2 Планировщик
| Библиотека |
Статус |
Почему |
| APScheduler |
✅ СТАНДАРТ |
Гибкий, cron, intervals |
| Celery Beat |
⚠️ С Celery |
Если уже есть Celery |
| schedule |
⚠️ Простой |
Минималистичный |
| cron (системный) |
❌ НЕТ |
Вне Python, сложнее управлять |
# Почему APScheduler:
# 1. Работает внутри приложения
# 2. Cron синтаксис
# 3. Персистентность (БД)
from apscheduler.schedulers.asyncio import AsyncIOScheduler
scheduler = AsyncIOScheduler()
@scheduler.scheduled_job('cron', hour=3)
async def nightly_task():
await cleanup_old_data()
scheduler.start()
3.3 State Machines (FSM)
| Библиотека |
Статус |
Почему |
| transitions |
✅ СТАНДАРТ |
Гибкий, callbacks |
| python-statemachine |
⚠️ Альтернатива |
Декларативный |
| if/else |
❌ НЕТ |
Нечитаемо, баги |
# Почему transitions:
# 1. Явные состояния и переходы
# 2. Callbacks на переходы
# 3. Валидация переходов
from transitions import Machine
class Order:
states = ['new', 'paid', 'shipped', 'delivered', 'cancelled']
def __init__(self):
self.machine = Machine(model=self, states=Order.states, initial='new')
self.machine.add_transition('pay', 'new', 'paid')
self.machine.add_transition('ship', 'paid', 'shipped')
self.machine.add_transition('deliver', 'shipped', 'delivered')
self.machine.add_transition('cancel', ['new', 'paid'], 'cancelled')
order = Order()
order.pay() # new → paid
order.ship() # paid → shipped
УРОВЕНЬ 4: ИНТЕГРАЦИИ
4.1 HTTP клиент
| Библиотека |
Статус |
Почему |
| httpx |
✅ СТАНДАРТ |
Async + sync, HTTP/2, type hints |
| aiohttp |
⚠️ Только async |
Быстрее httpx, но только async |
| requests |
❌ НЕТ |
Sync, блокирует event loop |
# Почему httpx:
# 1. Async native
# 2. HTTP/2 поддержка
# 3. API как у requests
# 4. Type hints
import httpx
# Async
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com")
# Sync (для скриптов)
response = httpx.get("https://api.example.com")
4.2 Retry логика
| Библиотека |
Статус |
Почему |
| tenacity |
✅ СТАНДАРТ |
Гибкий, декораторы, async |
| backoff |
⚠️ Альтернатива |
Проще, но меньше фич |
| time.sleep |
❌ НЕТ |
Блокирует, нет логики |
# Почему tenacity:
# 1. Декоратор = минимум кода
# 2. Exponential backoff
# 3. Условия retry
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(min=1, max=10))
async def call_api():
async with httpx.AsyncClient() as client:
response = await client.get(url)
response.raise_for_status()
return response.json()
4.3 Email
| Библиотека |
Статус |
Почему |
| aiosmtplib |
✅ Async SMTP |
Async native |
| fastapi-mail |
✅ Простой API |
Jinja2 шаблоны, вложения |
| smtplib |
⚠️ Sync |
Блокирует, но простой |
# Почему fastapi-mail:
# 1. Jinja2 шаблоны для писем
# 2. Вложения
# 3. Async
from fastapi_mail import FastMail, MessageSchema, ConnectionConfig
conf = ConnectionConfig(
MAIL_USERNAME="user",
MAIL_PASSWORD="pass",
MAIL_FROM="noreply@example.com",
MAIL_SERVER="smtp.example.com"
)
message = MessageSchema(
subject="Welcome",
recipients=["user@example.com"],
template_body={"name": "User"}
)
fm = FastMail(conf)
await fm.send_message(message, template_name="welcome.html")
4.4 Платежи
| Библиотека |
Статус |
Почему |
| stripe |
✅ Международный |
Лучший API, документация |
| yookassa |
✅ Россия |
Официальный SDK ЮKassa |
| paypalrestsdk |
⚠️ PayPal |
Если нужен PayPal |
# Stripe
import stripe
stripe.api_key = "sk_..."
payment_intent = stripe.PaymentIntent.create(
amount=1000, # в копейках
currency="rub"
)
# YooKassa
from yookassa import Payment
payment = Payment.create({
"amount": {"value": "100.00", "currency": "RUB"},
"confirmation": {"type": "redirect", "return_url": "https://..."},
"description": "Заказ #123"
})
УРОВЕНЬ 5: ФАЙЛЫ
5.1 Файловая система
| Библиотека |
Статус |
Почему |
| aiofiles |
✅ Async I/O |
Не блокирует event loop |
| pathlib |
✅ Пути |
Удобный API для путей |
| open() |
❌ В async |
Блокирует event loop |
# Почему aiofiles:
# 1. Async чтение/запись
# 2. Не блокирует
import aiofiles
from pathlib import Path
async def read_file(path: Path) -> str:
async with aiofiles.open(path) as f:
return await f.read()
5.2 S3 / Облако
| Библиотека |
Статус |
Почему |
| aioboto3 |
✅ AWS async |
Async обёртка над boto3 |
| boto3 |
⚠️ Sync |
Если async не нужен |
| minio |
⚠️ MinIO |
Если используется MinIO |
# Почему aioboto3:
# 1. Async операции
# 2. Полный API AWS
import aioboto3
session = aioboto3.Session()
async with session.client("s3") as s3:
await s3.upload_file("local.txt", "bucket", "remote.txt")
5.3 Изображения
| Библиотека |
Статус |
Почему |
| Pillow |
✅ СТАНДАРТ |
Ресайз, конвертация, эффекты |
| opencv-python |
⚠️ CV задачи |
Компьютерное зрение |
| ImageMagick |
❌ НЕТ |
Внешняя зависимость |
# Pillow — всё что нужно для изображений
from PIL import Image
img = Image.open("photo.jpg")
img.thumbnail((800, 600))
img.save("thumbnail.jpg", quality=85)
5.4 Excel / CSV
| Библиотека |
Статус |
Почему |
| openpyxl |
✅ Excel (.xlsx) |
Чтение и запись |
| xlsxwriter |
⚠️ Только запись |
Быстрее для генерации |
| csv (stdlib) |
✅ CSV |
Встроенный, достаточно |
| pandas |
⚠️ Аналитика |
Если нужна обработка данных |
# openpyxl для Excel
from openpyxl import load_workbook
wb = load_workbook("data.xlsx")
ws = wb.active
for row in ws.iter_rows(values_only=True):
print(row)
5.5 PDF
| Библиотека |
Статус |
Почему |
| reportlab |
✅ Генерация |
Программная генерация PDF |
| pypdf |
✅ Чтение |
Парсинг существующих PDF |
| weasyprint |
⚠️ HTML → PDF |
Если есть HTML шаблон |
| pdfplumber |
⚠️ Извлечение |
Таблицы из PDF |
УРОВЕНЬ 6: REAL-TIME
6.1 WebSocket
| Библиотека |
Статус |
Почему |
| FastAPI WebSocket |
✅ Встроенный |
Нативная поддержка |
| websockets |
⚠️ Низкоуровневый |
Если нужен контроль |
| Socket.IO |
⚠️ Совместимость |
Если фронтенд на Socket.IO |
# FastAPI WebSocket
from fastapi import WebSocket
@app.websocket("/ws/{user_id}")
async def websocket_endpoint(websocket: WebSocket, user_id: str):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Received: {data}")
6.2 Server-Sent Events (SSE)
| Библиотека |
Статус |
Почему |
| sse-starlette |
✅ СТАНДАРТ |
Простой SSE для FastAPI |
from sse_starlette.sse import EventSourceResponse
@app.get("/stream")
async def stream():
async def event_generator():
while True:
yield {"data": "message"}
await asyncio.sleep(1)
return EventSourceResponse(event_generator())
УРОВЕНЬ 7: UI / FRONTEND
7.1 Шаблоны
| Библиотека |
Статус |
Почему |
| Jinja2 |
✅ СТАНДАРТ |
Мощный, расширяемый |
| Mako |
⚠️ Альтернатива |
Быстрее, но менее популярен |
7.2 Интерактивность (без JS фреймворков)
| Библиотека |
Статус |
Почему |
| htmx |
✅ СТАНДАРТ |
AJAX без JS кода |
| Alpine.js |
✅ Простая логика |
Реактивность без сборки |
<!-- htmx — AJAX без JavaScript -->
<button hx-post="/api/like" hx-swap="outerHTML">
Like
</button>
<!-- Alpine.js — реактивность -->
<div x-data="{ count: 0 }">
<button @click="count++">+</button>
<span x-text="count"></span>
</div>
7.3 Админка
| Библиотека |
Статус |
Почему |
| SQLAdmin |
✅ SQLAlchemy |
Простая, современная |
| FastAPI-Amis-Admin |
✅ Мощная |
Как Django Admin |
| Starlette-Admin |
⚠️ Альтернатива |
Поддержка разных ORM |
# SQLAdmin
from sqladmin import Admin, ModelView
admin = Admin(app, engine)
class UserAdmin(ModelView, model=User):
column_list = [User.id, User.email, User.created_at]
column_searchable_list = [User.email]
admin.add_view(UserAdmin)
УРОВЕНЬ 8: ТЕСТИРОВАНИЕ
8.1 Фреймворк
| Библиотека |
Статус |
Почему |
| pytest |
✅ СТАНДАРТ |
Фикстуры, плагины, параметризация |
| unittest |
❌ НЕТ |
Verbose, устаревший стиль |
8.2 Async тесты
| Библиотека |
Статус |
Почему |
| pytest-asyncio |
✅ СТАНДАРТ |
Async фикстуры и тесты |
| anyio |
⚠️ Универсальный |
Если нужна совместимость trio |
8.3 HTTP тесты
| Библиотека |
Статус |
Почему |
| httpx.AsyncClient |
✅ СТАНДАРТ |
Async, для FastAPI |
| TestClient |
⚠️ Sync |
Если async не нужен |
| requests |
❌ НЕТ |
Sync, блокирует |
8.4 Моки
| Библиотека |
Статус |
Почему |
| pytest-mock |
✅ СТАНДАРТ |
Удобная обёртка |
| respx |
✅ HTTP моки |
Моки для httpx |
| unittest.mock |
⚠️ Stdlib |
Если не нужны зависимости |
# Полный пример теста
import pytest
from httpx import AsyncClient, ASGITransport
@pytest.fixture
async def client():
async with AsyncClient(
transport=ASGITransport(app=app),
base_url="http://test"
) as ac:
yield ac
@pytest.mark.asyncio
async def test_create_user(client):
response = await client.post("/users", json={"email": "test@test.com"})
assert response.status_code == 200
УРОВЕНЬ 9: OBSERVABILITY
9.1 Логирование
| Библиотека |
Статус |
Почему |
| structlog |
✅ Production |
Структурированные логи, JSON |
| loguru |
✅ Development |
Красивый вывод, простой API |
| logging (stdlib) |
⚠️ Если нужно |
Стандартный, но verbose |
| print() |
❌ НЕТ |
Непрофессионально |
# loguru — для разработки
from loguru import logger
logger.info("Processing {count} items", count=42)
# structlog — для production
import structlog
log = structlog.get_logger()
log.info("processing", count=42, user_id=123)
# Вывод: {"event": "processing", "count": 42, "user_id": 123, "timestamp": "..."}
9.2 Метрики
| Библиотека |
Статус |
Почему |
| prometheus-fastapi-instrumentator |
✅ СТАНДАРТ |
Автоматические метрики |
| starlette-exporter |
⚠️ Альтернатива |
Базовые метрики |
from prometheus_fastapi_instrumentator import Instrumentator
app = FastAPI()
Instrumentator().instrument(app).expose(app)
# Метрики доступны на /metrics
9.3 Трейсинг
| Библиотека |
Статус |
Почему |
| OpenTelemetry |
✅ СТАНДАРТ |
Стандарт индустрии |
| Jaeger |
⚠️ Бэкенд |
Хранение трейсов |
УРОВЕНЬ 10: ИНФРАСТРУКТУРА
10.1 Контейнеризация
| Инструмент |
Статус |
Почему |
| Docker |
✅ СТАНДАРТ |
Изоляция, воспроизводимость |
| docker-compose |
✅ Dev/Prod |
Оркестрация контейнеров |
| Kubernetes |
⚠️ Enterprise |
Если нужно масштабирование |
| virtualenv |
❌ Для prod |
Только для разработки |
10.2 Reverse Proxy
| Инструмент |
Статус |
Почему |
| Traefik |
✅ СТАНДАРТ |
Автоконфигурация, Let's Encrypt |
| Nginx |
⚠️ Классика |
Если уже используется |
| Caddy |
⚠️ Альтернатива |
Простой, автоматический HTTPS |
11.1 Линтер + Форматтер
| Инструмент |
Статус |
Почему |
| ruff |
✅ СТАНДАРТ |
Быстрый (Rust), всё в одном |
| black |
⚠️ Только форматтер |
Если ruff не подходит |
| flake8 |
❌ НЕТ |
ruff быстрее и мощнее |
| pylint |
❌ НЕТ |
Медленный |
# pyproject.toml
[tool.ruff]
line-length = 100
target-version = "py312"
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B"]
11.2 Type Checker
| Инструмент |
Статус |
Почему |
| ty |
✅ Новый стандарт |
Супербыстрый (Rust), от Astral |
| mypy |
⚠️ Классика |
Если ty не подходит |
| pyright |
⚠️ VS Code |
Если используется VS Code |
11.3 Package Manager
| Инструмент |
Статус |
Почему |
| uv |
✅ СТАНДАРТ |
В 10-100x быстрее pip, от Astral |
| poetry |
⚠️ Альтернатива |
Lock файлы, публикация |
| pip |
⚠️ Fallback |
Если uv недоступен |
# uv — новый стандарт
uv pip install fastapi
uv pip compile requirements.in -o requirements.txt
uv venv
СВОДНАЯ ТАБЛИЦА
| Категория |
Стандарт |
Почему |
| Фреймворк |
FastAPI |
Async, документация, скорость |
| Сервер |
uvicorn + gunicorn |
Надёжность + производительность |
| Конфиг |
pydantic-settings |
Валидация, типы |
| ORM |
SQLAlchemy 2.0 async |
Мощный, гибкий |
| Миграции |
Alembic |
Автогенерация |
| Валидация |
Pydantic v2 |
Интеграция с FastAPI |
| JSON |
orjson |
Скорость |
| Кэш |
Redis |
Персистентность, pub/sub |
| Пароли |
passlib + bcrypt |
Безопасность |
| JWT |
python-jose |
Полная поддержка JOSE |
| Задачи (I/O) |
ARQ |
Async native |
| Задачи (CPU) |
Celery |
Надёжность |
| HTTP клиент |
httpx |
Async + sync |
| Retry |
tenacity |
Гибкость |
| Файлы |
aiofiles |
Async I/O |
| S3 |
aioboto3 |
Async AWS |
| Изображения |
Pillow |
Универсальность |
| Excel |
openpyxl |
Чтение + запись |
| WebSocket |
FastAPI |
Встроенный |
| Шаблоны |
Jinja2 |
Стандарт |
| Интерактивность |
htmx + Alpine.js |
Без сборки |
| Админка |
SQLAdmin |
Простота |
| Тесты |
pytest + httpx |
Async поддержка |
| Логи (dev) |
loguru |
Удобство |
| Логи (prod) |
structlog |
JSON, структура |
| Метрики |
Prometheus |
Стандарт |
| Линтер |
ruff |
Скорость |
| Types |
ty |
Скорость |
| Packages |
uv |
Скорость |
Версия: 1.0.0