🗂 Роутеры

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, ...) задаёт пошаговый диалог на один апдейт (см. 🎬 Сцены)