Сравнение фреймворков и кросс-совместимость
Версия: 1.0.0
Дата: 2025-12-20
1. STREAMLIT vs FASTAPI + JINJA2
Сравнение
| Критерий |
Streamlit |
FastAPI + Jinja2 |
| Назначение |
Дашборды, прототипы |
Web-приложения, API |
| Архитектура |
Монолит, stateful |
Stateless API |
| Масштабирование |
❌ Плохо |
✅ Хорошо |
| Кастомизация UI |
❌ Ограничена |
✅ Полная |
| Production |
⚠️ Ограничено |
✅ Да |
| Async |
❌ Нет |
✅ Да |
| Скорость разработки |
⭐⭐⭐⭐⭐ |
⭐⭐⭐ |
| Скорость работы |
⭐⭐ |
⭐⭐⭐⭐⭐ |
Когда что использовать
| Сценарий |
Выбор |
| Быстрый прототип для показа |
Streamlit |
| Production приложение |
FastAPI + Jinja2 |
| Дашборд с аналитикой |
~~Streamlit~~ → FastAPI + htmx |
| REST API + UI |
FastAPI + Jinja2 |
| Много пользователей |
FastAPI |
Кросс-совместимость
❌ НЕ СОВМЕСТИМЫ
Streamlit — отдельный процесс, не интегрируется в FastAPI.
Нельзя: встроить Streamlit компонент в FastAPI приложение.
АЛЬТЕРНАТИВА:
FastAPI + Jinja2 + htmx + Alpine.js
→ Тот же результат, но production-ready
Миграция Streamlit → FastAPI
# Было (Streamlit)
import streamlit as st
import pandas as pd
st.title("Dashboard")
data = pd.read_csv("data.csv")
st.dataframe(data)
st.line_chart(data["value"])
# Стало (FastAPI + Jinja2 + Chart.js)
# app/routers/dashboard.py
from fastapi import APIRouter, Request
from fastapi.templating import Jinja2Templates
router = APIRouter()
templates = Jinja2Templates(directory="templates")
@router.get("/dashboard")
async def dashboard(request: Request):
data = await get_data()
return templates.TemplateResponse("dashboard.html", {
"request": request,
"data": data
})
2. DJANGO vs FASTAPI
Сравнение
| Критерий |
Django |
FastAPI |
| Тип |
Full-stack |
API-first |
| Философия |
"Batteries included" |
Минимализм |
| Async |
⚠️ Частично (4.0+) |
✅ Native |
| ORM |
Django ORM |
SQLAlchemy |
| Админка |
✅ Встроенная |
⚠️ SQLAdmin |
| Auth |
✅ Встроенная |
⚠️ fastapi-users |
| Скорость |
⭐⭐⭐ |
⭐⭐⭐⭐⭐ |
| Документация API |
⚠️ DRF + Swagger |
✅ Автоматически |
| Type hints |
⚠️ Опционально |
✅ Обязательно |
| Кривая обучения |
Крутая |
Пологая |
Когда что использовать
| Сценарий |
Выбор |
| CMS, блог, e-commerce |
Django |
| REST/GraphQL API |
FastAPI |
| Микросервисы |
FastAPI |
| Монолит с админкой |
Django |
| High-load API |
FastAPI |
| Быстрый старт с auth |
Django |
Кросс-совместимость
⚠️ ОГРАНИЧЕННО СОВМЕСТИМЫ
Можно:
1. Django как монолит + FastAPI микросервисы
2. Django для админки + FastAPI для API
3. Общая БД (PostgreSQL)
Нельзя:
1. Использовать Django ORM в FastAPI (несовместимы)
2. Django views в FastAPI (разные фреймворки)
АРХИТЕКТУРА:
┌─────────────┐ ┌─────────────┐
│ Django │ │ FastAPI │
│ Админка │ │ API │
└──────┬──────┘ └──────┬──────┘
│ │
└───────┬───────────┘
▼
┌─────────────┐
│ PostgreSQL │
└─────────────┘
Пример: Django Admin + FastAPI API
# FastAPI читает ту же БД, что Django
# settings.py (Django)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myapp',
'HOST': 'localhost',
}
}
# config.py (FastAPI)
class Settings(BaseSettings):
database_url: str = "postgresql+asyncpg://localhost/myapp"
# Модели должны быть синхронизированы!
# Django ORM ↔ SQLAlchemy — разные модели, одна таблица
3. FLASK vs FASTAPI
Сравнение
| Критерий |
Flask |
FastAPI |
| Async |
❌ Нет (без расширений) |
✅ Native |
| Скорость |
⭐⭐⭐ |
⭐⭐⭐⭐⭐ |
| Документация API |
⚠️ Flask-OpenAPI |
✅ Автоматически |
| Валидация |
⚠️ Marshmallow |
✅ Pydantic |
| Type hints |
⚠️ Опционально |
✅ Обязательно |
| WebSocket |
⚠️ Flask-SocketIO |
✅ Встроенный |
| Dependency Injection |
❌ Нет |
✅ Встроенный |
| Экосистема |
⭐⭐⭐⭐⭐ Огромная |
⭐⭐⭐⭐ Растёт |
Когда что использовать
| Сценарий |
Выбор |
| Новый проект |
FastAPI |
| Legacy проект на Flask |
Оставить Flask |
| Микросервисы |
FastAPI |
| Простой sync API |
Flask (если уже знаешь) |
| Async, WebSocket |
FastAPI |
Кросс-совместимость
✅ ХОРОШО СОВМЕСТИМЫ (миграция)
Flask и FastAPI — оба WSGI/ASGI.
Можно постепенно мигрировать.
СТРАТЕГИЯ МИГРАЦИИ:
1. Запустить FastAPI рядом с Flask
2. Перенести endpoints по одному
3. Переключить трафик
4. Выключить Flask
МОЖНО:
- Общие библиотеки (SQLAlchemy, requests/httpx)
- Общая БД
- Общий Redis/Celery
НЕЛЬЗЯ:
- Flask extensions в FastAPI
- Flask-Login → fastapi-users
Таблица миграции Flask → FastAPI
| Flask |
FastAPI |
@app.route("/") |
@app.get("/") |
request.args |
Query() |
request.form |
Form() |
request.json |
Pydantic model |
Flask-SQLAlchemy |
SQLAlchemy 2.0 async |
Flask-Login |
fastapi-users / JWT |
Flask-Marshmallow |
Pydantic |
Flask-RESTful |
APIRouter |
Flask-SocketIO |
FastAPI WebSocket |
Пример миграции
# Flask
from flask import Flask, request, jsonify
from marshmallow import Schema, fields
app = Flask(__name__)
class UserSchema(Schema):
name = fields.Str(required=True)
email = fields.Email(required=True)
@app.route("/users", methods=["POST"])
def create_user():
schema = UserSchema()
data = schema.load(request.json)
user = create_user_in_db(data)
return jsonify(schema.dump(user))
# FastAPI
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
app = FastAPI()
class UserCreate(BaseModel):
name: str
email: EmailStr
class UserRead(BaseModel):
id: int
name: str
email: EmailStr
@app.post("/users", response_model=UserRead)
async def create_user(user: UserCreate):
return await create_user_in_db(user.model_dump())
4. REQUESTS vs HTTPX
Сравнение
| Критерий |
requests |
httpx |
| Async |
❌ Нет |
✅ Да |
| HTTP/2 |
❌ Нет |
✅ Да |
| Type hints |
⚠️ Частично |
✅ Полностью |
| API |
Классический |
Совместим с requests |
| Timeout |
⚠️ Опасный default |
✅ Обязательный |
| Streaming |
✅ Да |
✅ Да |
| Cookies |
✅ Да |
✅ Да |
Когда что использовать
| Сценарий |
Выбор |
| FastAPI приложение |
httpx |
| Async код |
httpx |
| Sync скрипт |
requests ИЛИ httpx |
| HTTP/2 |
httpx |
| Legacy код |
requests |
Кросс-совместимость
✅ ПОЛНОСТЬЮ СОВМЕСТИМЫ
httpx создан как drop-in замена requests.
API практически идентичен.
МИГРАЦИЯ: Замена импорта!
Миграция requests → httpx
# requests (sync)
import requests
response = requests.get("https://api.example.com/users")
data = response.json()
# httpx (sync) — просто замена импорта!
import httpx
response = httpx.get("https://api.example.com/users")
data = response.json()
# httpx (async) — для FastAPI
import httpx
async def get_users():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/users")
return response.json()
Различия
# requests — timeout опционален (опасно!)
requests.get(url) # может висеть бесконечно
# httpx — timeout обязателен
httpx.get(url) # default timeout есть
httpx.get(url, timeout=30) # явный timeout
СВОДНАЯ МАТРИЦА СОВМЕСТИМОСТИ
Streamlit Django Flask FastAPI
Streamlit — ❌ ❌ ❌
Django ❌ — ⚠️ ⚠️
Flask ❌ ⚠️ — ✅
FastAPI ❌ ⚠️ ✅ —
❌ = Несовместимы
⚠️ = Можно совмещать (разные сервисы)
✅ = Миграция возможна
РЕКОМЕНДАЦИИ
Новый проект
ВСЕГДА → FastAPI
Причины:
1. Async native
2. Автодокументация
3. Type safety (Pydantic)
4. Скорость
5. Современный стек
Существующий проект
Flask → Мигрировать на FastAPI (постепенно)
Django → Оставить (если монолит с админкой)
Streamlit → Переписать на FastAPI + htmx
requests → Заменить на httpx
Микросервисная архитектура
┌─────────────────────────────────────────────┐
│ Gateway │
│ (Traefik) │
└─────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ FastAPI │ │ FastAPI │ │ Django │
│ Users API │ │ Products API│ │ Admin │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└──────────────┴──────────────┘
│
▼
┌─────────────┐
│ PostgreSQL │
└─────────────┘
BLACKLIST (НЕ ИСПОЛЬЗОВАТЬ В НОВЫХ ПРОЕКТАХ)
| Технология |
Причина |
Замена |
| Streamlit |
Не масштабируется |
FastAPI + htmx |
| Flask (новый проект) |
Sync, устаревший |
FastAPI |
| requests (в async) |
Блокирует |
httpx |
| Django REST Framework |
Сложный |
FastAPI |
Версия: 1.0.0