Фреймворки и библиотеки Python
Фреймворки
Фреймворки в экосистеме Python предоставляют готовые инструменты для маршрутизации, обработки запросов, работы с базами данных, аутентификации и многого другого, позволяя разработчикам сосредоточиться на бизнес-логике, а не на низкоуровневой инфраструктуре.
Давайте рассмотрим фреймворки, и сгруппируем их как синхронные и асинхронные.
Синхронные фреймворки
Что такое синхронный фреймворк?
Синхронные фреймворки обрабатывают один HTTP-запрос за раз в рамках одного потока. Пока запрос не завершён (например, ожидается ответ от базы данных), поток блокируется. Это простая модель, но она может стать узким местом при высокой нагрузке или большом количестве I/O-операций.
Django
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!")
Разбор примера:
from ... import ...импортирует классы из модулей Django.def hello(request):объявляет view-функцию. Аргументrequestсодержит HTTP-запрос.return HttpResponse(...)формирует HTTP-ответ с телом"Hello from Django!".- Функция будет вызвана роутером Django, когда URL сопоставится с этой view. Django применяется в Instagram, Pinterest, Mozilla, The Washington Post.
Flask
Flask — минималистичный фреймворк, предоставляющий только базовые инструменты: маршрутизацию, обработку запросов и шаблоны. Всё остальное (ORM, валидация, авторизация) добавляется через расширения.
Собственно, это главная особенность - гибкая архитектура, можно начать с малого и масштабироваться в дальнейшем. Здесь довольно богатая экосистема расширений, к примеру, Flask-SQLAlchemy, Flask-WTF, Flask-Login. Пример:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello from Flask!"
Разбор примера:
Flask(__name__)создает объект приложения и использует имя текущего модуля для поиска шаблонов и ресурсов.@app.route('/')регистрирует маршрут/и связывает его с функциейhello.def hello()описывает обработчик запроса.return "..."во Flask автоматически превращается в HTTP-ответ со статусом200 OK.
Pyramid
Pyramid позиционируется как фреймворк для проектов любого масштаба — от простых скриптов до крупных систем. Здесь есть поддержка как минималистичного, так и расширенного подхода, гибкая система маршрутизации, интеграция с различными ORM и шаблонизаторами. Подходит, когда нужна гибкость Flask, но с возможностью масштабирования до уровня Django.
Pyramid - это гибкий веб-фреймворк для Python, который следует философии минимализма в ядре и предоставляет разработчику свободу выбора компонентов, начиная от маршрутизации и заканчивая работой с базами данных, при этом его архитектура построена вокруг концепции локализации ресурсов и явного описания зависимостей, что делает его одинаково подходящим как для небольших приложений, так и для сложных корпоративных систем, масштабируемых за счет модульной структуры и обширного настраиваемого механизма обработки запросов.
Асинхронные фреймворки
Что такое асинхронный фреймворк?
Асинхронные фреймворки используют модель event loop и корутины (async/await), что позволяет обрабатывать тысячи соединений одновременно без блокировки потоков. Это особенно важно для I/O-bound задач — сетевые запросы, работа с БД, WebSocket.
Event loop, или цикл событий, представляет собой фундаментальную управляющую структуру в асинхронном программировании, которая непрерывно работает в фоновом режиме, ожидая наступления различных событий, таких как завершение операций ввода-вывода, истечение таймеров или поступление новых соединений, после чего она извлекает эти события из очереди и диспетчеризирует их соответствующим обработчикам, обеспечивая тем самым неблокирующее выполнение задач в рамках одного потока.
Корутины, или сопрограммы, являются специальными функциями, которые могут приостанавливать свое выполнение в точке ожидания, передавая управление обратно циклу событий, и возобновлять работу позже с того же места, сохраняя при этом все внутреннее состояние, что позволяет им эффективно обрабатывать множество параллельных операций без использования системных потоков, при этом их определение в Python происходит через ключевые слова async и await, превращающие обычную функцию в асинхронную.
aiohttp
aiohttp — один из первых асинхронных фреймворков на Python, построенный на asyncio. Он поддерживает как серверную часть (web server), так и асинхронный HTTP-клиент.
Asyncio - это стандартная библиотека Python, предназначенная для написания конкурентного кода с использованием асинхронных операций, которая предоставляет разработчику полноценный цикл событий, набор инструментов для работы с корутинами, поддержку сетевых протоколов и утилиты для синхронизации, при этом она реализует модель асинхронного ввода-вывода на основе паттерна Reactor, позволяя создавать высокопроизводительные приложения, эффективно утилизирующие системные ресурсы.
Ключевые возможности - обработка тысяч запросов параллельно, поддержка 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)
Разбор примера:
async defобъявляет корутину: обработчик может выполнятьawaitбез блокировки event loop.web.Response(...)собирает HTTP-ответ с текстовым телом.web.Application()создает ASGI/async-приложение aiohttp.app.add_routes([web.get('/', hello)])добавляет правило маршрутизации.web.run_app(app)запускает сервер и начинает принимать соединения.
FastAPI
FastAPI — один из самых популярных современных фреймворков, сочетающий асинхронность, автоматическую документацию (Swagger/OpenAPI) и поддержку аннотаций типов.
Аннотация типов, или подсказки типов, представляют собой синтаксическую конструкцию в Python, которая позволяет явно указывать ожидаемые типы данных для аргументов функций и возвращаемых значений, что улучшает читаемость кода, облегчает его документирование и дает возможность использовать внешние статические анализаторы, такие как mypy, для обнаружения потенциальных ошибок на этапе разработки, однако эти аннотации не влияют на выполнение программы и остаются чисто информационными для разработчика и инструментов.
Он основан на Starlette (для web) и Pydantic (для валидации), имеет автоматическую генерацию интерактивной документации, и высокую производительность (оправдывая название).
Starlette - это легковесный ASGI-фреймворк для создания веб-приложений и асинхронных сервисов, который отличается высокой производительностью и минималистичным дизайном, предлагая разработчику маршрутизацию, поддержку веб-сокетов, механизмы для работы с запросами и ответами, а также встроенные возможности для обработки фоновых задач, и при этом он служит фундаментом для более высокоуровневых фреймворков, полностью используя все преимущества асинхронной модели выполнения.
Pydantic - это библиотека для валидации данных и управления настройками в Python, которая использует аннотации типов для определения схем данных и автоматически проверяет соответствие входных значений этим схемам, выполняет преобразование типов и генерирует подробные сообщения об ошибках, что делает ее незаменимым инструментом для обработки входящих запросов, чтения конфигурационных файлов и обеспечения целостности данных во всех слоях приложения.
Пример:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello():
return {"message": "Hello from FastAPI!"}
Разбор примера:
FastAPI()инициализирует приложение с автогенерацией OpenAPI-схемы.@app.get("/")объявляет endpoint для методаGET.async def hello()позволяет неблокирующие I/O-операции внутри обработчика.- Возврат
dictавтоматически сериализуется в JSON ({"message": ...}).
gevent
gevent — это библиотека, реализующая cooperative multitasking с помощью зелёных потоков (greenlets). Она позволяет запускать синхронный код в асинхронном режиме, перехватывая I/O-вызовы. Она перезаписывает стандартные функции ввода-вывода (например, socket, time.sleep) на неблокирующие версии и не требует использования async/await.
Cooperative multitasking, или кооперативная многозадачность, является моделью управления параллелизмом, при которой каждая задача добровольно решает, когда передать управление другим задачам, обычно в точках ожидания ввода-вывода или по достижении логической паузы, что требует от разработчика сознательного указания таких точек через специальные конструкции, в отличие от вытесняющей многозадачности, где операционная система принудительно переключает контексты, и такой подход позволяет избежать проблем с синхронизацией и снижает накладные расходы на переключения.
Greenlets, или зеленые потоки, являются легковесными сопрограммами, реализованными в виде отдельного модуля для Python, которые работают в рамках одного системного потока и выполняют совместную многозадачность за счет явной передачи управления между ними через вызовы специальных методов, при этом они не используют стек операционной системы и позволяют значительно сократить затраты памяти и процессорного времени по сравнению с обычными потоками, что делает их популярными для высоконагруженных сетевых приложений.
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()
Разбор примера:
WSGIServer((host, port), app)поднимает WSGI-сервер и передает ему Flask-приложение.- Адрес
0.0.0.0означает прослушивание всех сетевых интерфейсов. serve_forever()запускает бесконечный цикл обработки входящих запросов.- Пара gevent + Flask дает кооперативную конкурентность без переписывания всего приложения на
async/await. Это нужно для ускорения уже существующих 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!"
Разбор примера:
async defвключает асинхронный обработчик во Flask 2+.await asyncio.sleep(1)приостанавливает только текущую корутину, а event loop в это время обслуживает другие задачи.- После завершения
awaitфункция возвращает строку как HTTP-ответ. - Такой подход полезен при I/O-нагрузке, но экосистема Flask остается преимущественно синхронной.
С ограничениями, конечно. Асинхронность работает только с ASGI-серверами (например, Hypercorn, Uvicorn) и большинство расширений Flask всё ещё синхронные, и нет поддержки WebSocket. Flask можно использовать в асинхронном режиме, но он не является "нативно асинхронным" фреймворком, как FastAPI или Aiohttp.
ASGI-сервера, или серверы, реализующие спецификацию Asynchronous Server Gateway Interface, представляют собой программное обеспечение, которое обеспечивает связь между веб-сервером и асинхронными приложениями на Python, принимая входящие HTTP-запросы, веб-сокетные соединения и другие протоколы, и передавая их в приложение через стандартизированный интерфейс, который поддерживает асинхронные вызовы и долгоживущие соединения, при этом наиболее известными примерами таких серверов являются Uvicorn, Daphne и Hypercorn, обеспечивающие высокую пропускную способность и масштабируемость.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.