Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Фреймворки которые мне не нравятся (и почему)
После 10+ лет разработки я имею чёткое мнение про различные фреймворки. Вот мой honest feedback.
Django (большое НО)
Почему не нравится
# Django имеет очень большую кривую обучения
# Слишком много "magic" под капотом
from django.db import models
from django.views import View
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class UserListView(View):
def get(self, request):
users = User.objects.all()
return render(request, 'users.html', {'users': users})
# Проблемы:
# 1. Models связаны с views связаны с forms (слишком тесная связь)
# 2. ORM скрывает SQL (when it gets slow, you're lost)
# 3. Миграции иногда конфликтуют между собой
# 4. Settings.py имеет 100+ параметров (много defaults которые никто не понимает)
# 5. Django admin "волшебный" но это ад когда нужно кастомизировать
Плюсы Django
- Батарея включена (auth, admin, migrations)
- Для CRUD приложений очень быстро
- Большое сообщество и много packages
- Документация хорошая
- security by default (CSRF protection, SQL injection prevention)
Когда использовать Django
✅ Хорошо для:
- Стартап который нужен за неделю
- Админ панель для управления данными
- Traditional CRUD приложений
- Когда нужна готовая архитектура
❌ Плохо для:
- Микросервисов (слишком монолитный)
- Real-time приложений (Django не async-first)
- API которые нужны fast и lean
- Когда нужен полный контроль над кодом
Flask (слишком минималистичный)
Почему раньше не нравился
# Flask слишком простой, нужно всё делать вручную
from flask import Flask
app = Flask(__name__)
@app.route('/users/<int:user_id>')
def get_user(user_id):
user = db.query(User).filter(User.id == user_id).first()
if not user:
return {'error': 'Not found'}, 404
return {'id': user.id, 'name': user.name}
# Проблемы:
# 1. Нет встроенного ORM (нужно использовать SQLAlchemy)
# 2. Нет встроенной валидации (нужно Marshmallow/Pydantic)
# 3. Нет встроенной аутентификации (нужно Flask-Login)
# 4. На каждый проект нужно писать boilerplate для init
# 5. Сложно масштабировать на большой проект
Сейчас мое мнение изменилось
После появления Flask-RESTX и улучшений Flask в 2.0+
Flask стал гораздо лучше
Плюсы:
- Очень простой для начинающих
- Полный контроль над архитектурой
- Легко интегрировать custom solutions
- Много расширений (Flask-SQLAlchemy, Flask-Login и т.д.)
- Документация супер понятная
Минусы:
- Нужно написать много boilerplate
- Нужны расширения для features Django'а
Bottle (слишком простой)
from bottle import route, run
@route('/hello')
def hello():
return 'Hello World!'
run(host='localhost', port=8080)
# Проблемы:
# 1. Слишком маленький фреймворк (даже меньше Flask)
# 2. Слишком мало документации
# 3. Мало packages экосистемы
# 4. Нет встроенной поддержки features
# 5. На production используется редко
# Когда использовать:
# - Простые скрипты или microservices
# - Обучение (понять как работают веб фреймворки)
# - Не подходит для production приложений
Tornado (старый)
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('Hello, World!')
# Проблемы:
# 1. Очень старый синтаксис (как 2010 год)
# 2. Был async first в 2010 году (когда async был нужен)
# 3. Теперь есть FastAPI, Starlette, ASGI (намного лучше)
# 4. Документация плохая
# 5. Сообщество маленькое
# Сейчас:
# - Не рекомендую для new projects
# - Только если есть legacy code
Pyramid (забыл что существует)
from pyramid.config import Configurator
def hello_world(request):
return {'message': 'Hello World!'}
if __name__ == '__main__':
config = Configurator()
config.add_route('hello', '/')
config.add_view(hello_world, route_name='hello')
app = config.make_wsgi_app()
# Проблемы:
# 1. Никто не использует (community очень маленькое)
# 2. Документация запущена (последнее обновление 2019?)
# 3. Попытка быть между Django и Flask (не очень получилось)
# 4. Configuration through code (когда нужен flexibility)
# Вывод:
# - Забыл что он существует
# - На production редко используется
# - Для нового проекта не стану использовать
Фреймворки которые мне НРАВЯТСЯ
FastAPI (рекомендую!)
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
id: int
name: str
email: str
@app.get('/users/{user_id}', response_model=User)
async def get_user(user_id: int):
user = await db.get_user(user_id)
if not user:
raise HTTPException(status_code=404)
return user
# Плюсы:
# 1. Async first (встроенный asyncio support)
# 2. Автоматическая валидация (Pydantic)
# 3. Автоматическая документация (Swagger UI, ReDoc)
# 4. Type hints (mypy compatible)
# 5. Очень быстрый (один из самых быстрых Python фреймворков)
# 6. Модерн и активно развивается
# 7. Хорошая экосистема packages
# Когда использовать:
# ✅ Микросервисы
# ✅ REST API (особенно с complex validation)
# ✅ Async приложения
# ✅ Когда нужна production ready система за 2 недели
Starlette (для async HTTP)
from starlette.applications import Starlette
from starlette.responses import JSONResponse
app = Starlette()
@app.route('/users/{user_id}', methods=['GET'])
async def get_user(request):
user_id = request.path_params['user_id']
return JSONResponse({'id': user_id})
# Плюсы:
# 1. Очень lean (основа FastAPI)
# 2. ASGI-native
# 3. Хорошее middleware support
# 4. Async from the ground up
# 5. Контроль над каждой частью
# Когда использовать:
# - Когда нужна более full control чем FastAPI
# - Когда нужно писать сложные middleware
# - Когда хочешь понять как работает HTTP с async
SQLAlchemy (не фреймворк, но critical)
from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.orm import declarative_base, sessionmaker
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
engine = create_engine('postgresql://localhost/db')
Base.metadata.create_all(engine)
# Плюсы:
# 1. Очень гибкий (можно использовать с любым фреймворком)
# 2. Поддержка множества databases
# 3. Lazy loading, eager loading, selective loading
# 4. Raw SQL когда нужно
# 5. Встроенная поддержка transactions
# Это не фреймворк, это инструмент для работы с БД
# Рекомендую использовать вместо Django ORM
Почему я не люблю некоторые фреймворки
Основная причина: слишком много "magic"
Django:
```python
from django.db import models
class User(models.Model): name = models.CharField(max_length=100)
def __str__(self):
return self.name
Вопросы которые возникают у new разработчиков:
- Почему нужен str?
- Как это связано с views?
- Почему migrations sometimes conflict?
- Где на самом деле обрабатывается request?
- Почему это медленно на production?
- Как вообще это работает?
FastAPI (clear и explicit):
from fastapi import FastAPI from sqlalchemy import Column, String, Integer from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base): tablename = 'users' id = Column(Integer, primary_key=True) name = Column(String)
app = FastAPI()
@app.get('/users/{user_id}')
async def get_user(user_id: int): user = await db.query(User).filter(User.id == user_id).first() return user
Здесь всё explicit и понятно:
- Модель БД отделена от API
- Handler явно указан
- Type hints и валидация явные
- Нет hidden connections
### Таблица сравнения фреймворков
| Фреймворк | Скорость | Простота | Async | Экосистема | Рекомендую? |
|---|---|---|---|---|---|
| Django | Средняя | Средняя | Нет | Огромная | Для стартапов |
| Flask | Средняя | Высокая | Нет | Большая | Если know что делаешь |
| FastAPI | Высокая | Средняя | Да | Растущая | ДА! (лучший выбор) |
| Starlette | Высокая | Низкая | Да | Средняя | Для advanced |
| Tornado | Высокая | Низкая | Да | Маленькая | Нет (устарел) |
| Bottle | Средняя | Высокая | Нет | Маленькая | Только для обучения |
| Pyramid | Средняя | Средняя | Нет | Маленькая | Нет |
### Мой личный выбор для разных сценариев
Нужен стартап за неделю? -> Django + Django REST Framework -> Быстро, есть всё включено
Нужен production API? -> FastAPI + SQLAlchemy -> Async, fast, типизирован, modern
Нужна микросервисная архитектура? -> FastAPI + Docker + Kubernetes -> Lean, fast, легко масштабировать
Нужна админ панель для управления данными? -> Django + Django Admin -> Нет аналогов
Нужен small service с few endpoints? -> FastAPI -> или Starlette если нужен полный контроль
Нужен GraphQL API? -> Strawberry + FastAPI -> или Graphene + Django
Нужен Realtime WebSocket API? -> FastAPI + WebSocket -> или Starlette + WebSocket
### Заключение
Я не люблю фреймворки которые:
- ❌ Слишком много magic (Django ORM)
- ❌ Слишком много boilerplate (Pyramid)
- ❌ Слишком старые (Tornado, Bottle)
- ❌ Слишком маленькая community (всё вышеперечисленное кроме Django)
- ❌ Плохая документация
- ❌ Нет async support (в 2024 году это critical)
Я люблю:
- ✅ Explicit и transparent (FastAPI)
- ✅ Async first (FastAPI, Starlette)
- ✅ Type hints и validation (FastAPI)
- ✅ Хорошая документация
- ✅ Активное development
- ✅ Большое сообщество или нишевое но качественное
- ✅ Выбор что использовать (не forced decisions)
Лучший выбор на 2024 год для Python backend: **FastAPI + SQLAlchemy + asyncpg**