Перейти к основному содержимому

5.02. Фреймворки

Разработчику Архитектору

Фреймворки

Фреймворки в экосистеме Python предоставляют готовые инструменты для маршрутизации, обработки запросов, работы с базами данных, аутентификации и многого другого, позволяя разработчикам сосредоточиться на бизнес-логике, а не на низкоуровневой инфраструктуре.

Давайте рассмотрим фреймворки, и сгруппируем их как синхронные и асинхронные.

Синхронные фреймворки

Синхронные фреймворки обрабатывают один HTTP-запрос за раз в рамках одного потока. Пока запрос не завершён (например, ожидается ответ от базы данных), поток блокируется. Это простая модель, но она может стать узким местом при высокой нагрузке или большом количестве I/O-операций.

Django — это полноценный веб-фреймворк с широким набором встроенных возможностей: ORM, админка, система шаблонов, аутентификация, миграции, кэширование и многое другое.

У него есть высокий уровень абстракции, мощная ORM, поддерживающая множественные БД (PostgreSQL, MySQL, SQLite), встроенная админ-панель для управления данными, поддержка MVC/MVT-архитектуры. Пример:

from django.http import HttpResponse
from django.views import View

def hello(request):
return HttpResponse("Hello from Django!")

Django применяется в Instagram, Pinterest, Mozilla, The Washington Post.

Flask — минималистичный фреймворк, предоставляющий только базовые инструменты: маршрутизацию, обработку запросов и шаблоны. Всё остальное (ORM, валидация, авторизация) добавляется через расширения.

Собственно, это главная особенность - гибкая архитектура, можно начать с малого и масштабироваться в дальнейшем. Здесь довольно богатая экосистема расширений, к примеру, Flask-SQLAlchemy, Flask-WTF, Flask-Login. Пример:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
return "Hello from Flask!"

Pyramid позиционируется как фреймворк для проектов любого масштаба — от простых скриптов до крупных систем. Здесь есть поддержка как минималистичного, так и расширенного подхода, гибкая система маршрутизации, интеграция с различными ORM и шаблонизаторами. Подходит, когда нужна гибкость Flask, но с возможностью масштабирования до уровня Django.

Асинхронные фреймворки

Асинхронные фреймворки используют модель event loop и корутины (async/await), что позволяет обрабатывать тысячи соединений одновременно без блокировки потоков. Это особенно важно для I/O-bound задач: сетевые запросы, работа с БД, WebSocket.

aiohttp — один из первых асинхронных фреймворков на Python, построенный на asyncio. Он поддерживает как серверную часть (web server), так и асинхронный HTTP-клиент.

Ключевые возможности - обработка тысяч запросов параллельно, поддержка WebSocket. Пример:

from aiohttp import web

async def hello(request):
return web.Response(text="Hello from Aiohttp!")

app = web.Application()
app.add_routes([web.get('/', hello)])
web.run_app(app)

FastAPI — один из самых популярных современных фреймворков, сочетающий асинхронность, автоматическую документацию (Swagger/OpenAPI) и поддержку аннотаций типов.

Он основан на Starlette (для web) и Pydantic (для валидации), имеет автоматическую генерацию интерактивной документации, и высокую производительность (оправдывая название). Пример:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def hello():
return {"message": "Hello from FastAPI!"}

gevent — это библиотека, реализующая cooperative multitasking с помощью зелёных потоков (greenlets). Она позволяет запускать синхронный код в асинхронном режиме, перехватывая I/O-вызовы. Она перезаписывает стандартные функции ввода-вывода (например, socket, time.sleep) на неблокирующие версии и не требует использования async/await.

from gevent.pywsgi import WSGIServer
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
return 'Hello from Flask + Gevent!'

# Запуск Flask с Gevent
http_server = WSGIServer(('0.0.0.0', 5000), app)
http_server.serve_forever()

Это нужно для ускорения уже существующих Flask/Django-приложений.

Хотя Flask изначально был синхронным, с выходом Flask 2.0 и Python 3.7+ он получил поддержку асинхронных view-функций. Начиная с Flask 2.0, можно использовать async def:

from flask import Flask
import asyncio

app = Flask(__name__)

@app.route('/async')
async def async_route():
await asyncio.sleep(1)
return "Async in Flask!"

С ограничениями, конечно. Асинхронность работает только с ASGI-серверами (например, Hypercorn, Uvicorn) и большинство расширений Flask всё ещё синхронные, и нет поддержки WebSocket. Flask можно использовать в асинхронном режиме, но он не является «нативно асинхронным» фреймворком, как FastAPI или Aiohttp.