system/agents/stacks/FRAMEWORK_COMPARISON.md

Сравнение фреймворков и кросс-совместимость

Версия: 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