🗂 Роутеры¶
Raito использует расширенный класс Router поверх встроенного роутера aiogram. Он добавляет загрузку по приоритету, управление автозагрузкой и бесшовную работу с системой hot-reload.
Как использовать¶
from raito import Router
router = Router(name="my_router")
@router.message()
async def handler(message):
await message.answer("Hello!")
Если файл лежит внутри routers_dir, Raito сам найдёт и зарегистрирует этот роутер.
Параметры¶
router = Router(
name="my_router",
priority=10,
autoload=True,
)
nameэто уникальное имя роутера; если не задать, Raito возьмёт его из имени файлаpriorityэто порядок загрузки: чем больше значение, тем раньше загрузка (по умолчанию0)autoload: приFalseроутер находится, но не загружается на старте (по умолчаниюTrue)
Приоритет¶
Когда роутеров несколько, они загружаются по убыванию приоритета. Роутеры с одинаковым приоритетом загружаются в алфавитном порядке имён файлов.
# loaded first
router = Router(name="auth", priority=100)
# loaded after auth
router = Router(name="general", priority=0)
Это важно, когда у одного роутера есть фильтры или middleware, от которых зависят другие.
Автозагрузка¶
Поставьте autoload=False, чтобы зарегистрировать роутер, но не активировать его на старте. Потом его можно загрузить вручную командами в Telegram или через RouterLoader.
router = Router(name="debug", autoload=False)
.rt load debug
Имена и конфликты¶
Имя каждого роутера должно быть уникальным в пределах routers_dir. Если два файла содержат роутер с одинаковым именем, Raito автоматически переименует второй:
WARNING: Duplicate router name: handler. Will rename to handler_0x7f3a1b2c...
Чтобы этого избежать, всегда задавайте явное name:
router = Router(name="shop_catalog")
Дополнительные методы¶
Router наследует всё от роутера aiogram и добавляет:
router.on_pagination(name, *filters)регистрирует хендлер колбэков пагинацииrouter.on_command_signature_error()обрабатывает неверный вызов командыrouter.lifespan()задаёт логику запуска и остановки (см. 🍃 Lifespan)router.scene(states, ...)задаёт пошаговый диалог на один апдейт (см. 🎬 Сцены)