1. Архитектура Litestar: приложение, роутинг, контроллеры, плагины
Архитектура Litestar: приложение, роутинг, контроллеры, плагины
Litestar — это ASGI-фреймворк для Python, ориентированный на высокую производительность, типизацию и явную архитектуру приложения. В продвинутой разработке главная ценность Litestar — возможность собрать приложение из понятных блоков: объекта приложения, дерева маршрутизации, контроллеров (групп обработчиков) и плагинов (расширений, подключаемых системно).
Эта статья закладывает общий архитектурный каркас курса: дальше мы будем углубляться в DI, работу с БД, OpenAPI, фоновые задачи, тестирование и деплой, опираясь на то, как именно Litestar склеивает обработчики запросов в приложение.
Полезные источники для сверки терминов и деталей:
!Общая карта компонентов Litestar и поток обработки запроса
Базовые термины: ASGI и обработчик маршрута
Чтобы уверенно разбираться в архитектуре Litestar, важно одинаково понимать несколько терминов:
Объект приложения Litestar: что в нём живёт
В Litestar всё начинается с объекта Litestar. Его удобно воспринимать как композицию нескольких уровней конфигурации.
Минимальная форма приложения
Здесь:
route_handlers — корневой список обработчиков и/или групп обработчиков (роутеров, контроллеров).get("/health") — декларативное описание маршрута (HTTP GET + путь).Что обычно конфигурируют на уровне приложения
В продакшн-приложении Litestar(...) часто становится точкой сборки:
state приложения (аккуратно, в основном для ресурсов и конфигов).Жизненный цикл: startup/shutdown и ресурсы
ASGI-приложение живёт в рамках процесса сервера. Для корректной инициализации соединений (БД, кэш, клиенты внешних API) используют хуки жизненного цикла.
Типичные задачи на старте:
Типичные задачи на остановке:
Практическое правило: инициализация ресурса должна быть привязана к жизненному циклу приложения, а не к импорту модулей.
Роутинг в Litestar: дерево маршрутов и композиция
Маршрутизация в Litestar — это дерево, которое собирается из обработчиков и группировок. Это удобно для модульности: вы можете включать функциональные блоки (например, users, billing, admin) как независимые поддеревья.
Маршруты как функции
Ключевые детали:
{user_id:int} — типизированный параметр пути. Litestar использует его для валидации и конвертации.Вложенная маршрутизация через Router
Когда эндпоинтов становится много, выносите их в Router и монтируйте под префиксом.
Это даёт:
Router).Приоритеты и предсказуемость
В реальном проекте важно поддерживать предсказуемость сопоставления маршрутов:
/{id:int} и /{slug:str} без явных префиксов)./users/{id} вместо /{entity}/{id}), если это не API-gateway./v1, /v2), если требуется параллельная поддержка.Контроллеры: группировка эндпоинтов как класс
Контроллеры решают проблему “много функций в одном модуле”: они дают единый базовый путь, общие зависимости и удобное группирование методов.
Контроллер — это класс, методы которого помечены декораторами маршрутов.
Зачем контроллеры в продвинутой архитектуре
Контроллеры полезны, когда нужно:
Практическое правило выбора: Router или Controller
Оба подхода можно комбинировать, но обычно:
Нормальная структура большого проекта часто выглядит так:
users) экспортирует Router.Плагины: расширение Litestar на уровне приложения
Плагин — это способ подключить расширение на уровне сборки приложения, чтобы оно:
В Litestar плагины особенно важны, когда вы хотите избежать копипаста конфигурации между сервисами (например, одинаковая настройка БД, логирования, сериализации, OpenAPI-метаданных).
Типовой сценарий: подключение готового плагина
Часто плагины используются для интеграций (например, ORM). Конкретный выбор зависит от стека и версии Litestar, но архитектурно важно понимать следующее:
Litestar(...).Сверяйте актуальный список и синтаксис плагинов в вашей версии:
Архитектурный контракт плагина
Даже если вы используете готовые плагины, полезно мыслить “как автор плагина”. Хороший плагин:
Мини-скелет собственного плагина (концептуально)
Конкретные протоколы и точки расширения могут меняться от версии к версии, поэтому ниже пример демонстрирует идею: централизованно подключить некоторую инфраструктуру и сделать её доступной обработчикам через приложение и/или DI.
Продвинутая идея, к которой мы вернёмся дальше по курсу: плагин должен создавать ресурсы в жизненном цикле и выдавать их через DI, чтобы обработчики не зависели от глобальных переменных.
Как эти части складываются в “правильное” приложение
В продвинутой архитектуре Litestar удобно придерживаться следующей композиции:
main.py) содержит только сборку Litestar(...).users, billing) предоставляет Router.Пример “склейки” модулей
Такой стиль даёт:
/api,/api/v1),Частые ошибки в архитектуре Litestar
Что дальше по курсу
В следующих материалах мы будем системно наращивать приложение:
Цель — чтобы к концу курса вы могли поддерживать крупное Litestar-приложение с предсказуемой архитектурой и минимальным “магическим” поведением.