так и диспетчером? Насколько я понял по доке, роутер можно вложить в другой роутрер и дальше как матрешку вкидывать роутеры, но все равно все роутеры вкидываются в диспетчер, верно? И если я объявляю
router1
router2
Дальше
dp.include_router(router1)
router1.include_router(router2)
И вызываю метод filter
router1.filter(...)
router2.filter(...)
Регистрирую хендлеры через router1
И хендлеры через router2
То к хендлерам через router2 будет применен 1 фильтр, а к router1 будет применено 2 фильтра, верно?
И последний вопрос. Сколько фильтров можно привязывать к роутерам?
@groosha ты пробовал такое?
> То к хендлерам через router2 будет применен 1 фильтр, > а к router1 будет применено 2 фильтра, верно? наоборот. на фильтры не думаю что есть какое-то ограничение кроме здравого смысла. Есть ограничение на то, что не может быть два одновременно активных баунд фильтра с одинаковыми названиями атрибутов.
Как это наоборот?! Я ж вроде вкладываю router2 в router1, значит роутер1 перенимать должен фильтр роутер2 и еще свой. Что-то я логику вложения не понял тогда, если "наоборот"
Есть коробка1 с отверствием 10 см(роутер1), ты положил внутрь коробку2 с отверствием 5см(роутер2). Вопрос: можно ли теперь поместить в коробку1 мяч размером 7см или она "переняла" размер отверствия коробки2 и теперь больше 5см не поместится? Размерами коробок кроме отверствия можно пренебречь.
Ну так а если вкладывать сначала 5см и дальше положить 10см, то сначала пролезет до 10 см и потом только до 5 😁
Давай на реальном примере разберем
Воспринимай это как наследование фильтров, оно работает сверху вниз, не наоборот
router1 = Router() router2 = Router() router1.include_router(router2) router1.filter(F.text) router2.filter(F.event_from_user.id == 1) @router1.message(text="test") async def f(m): # сработат на сообщение "test" от пользователя с любым id @router2.message() async def f(m): # сработать только на текстовые сообщения от юзера с id 1 (если текст не "test", иначе сработает первый хендлер)
Мне нужно прилепить к роутер1 фильтр с проверкой на админа, на роутер2 прикрепить фильтр на проверку на подписку на канал, на роутер3 навесить фильтр на проверку статуса забанен пользователь по флуду или нет. Далее вкладываю через router1.include_router(router2) По логике и переводу include(включая) роутер2 - роутер1 же должен наследовать фильтр роутер2 ну и тд. Создадутся для админа хендлеры и зарегистрируются под роутер1 и хендлеры под роутер2 не будут проверяться на админа. При этом хендлеры на админа должны проходить проверку только на самого админа, без остальных фильтров на проверку забанен или нет и подписчик или нет. Потому что админ. Пока описывал, сам запутался в логике своей
https://docs.aiogram.dev/en/dev-3.x/dispatcher/router.html#how-it-works
Да, я видел эту иерархию. Прост пока в голове не укладывается
Вложить роутер не значит расширить/дополнить первый роутер хендлерами и фильтрами из второго роутера
так это разные роутеры, зачем их включать друг в друга? включай их в диспетчер или другой независимый роутер dp.include_router(admin_router) dp.include_router(subscribe_router) dp.include_router(banned_user_router)
Ну так если нужно проверить забанен или нет, далее проверить подписчик или нет. При этом не важно подписчик или нет, пользователь может флудить и будучи подписанным или нет. Иначе получится, что роутер просто пропустит не забаненного пользователя и врубит хендлер не подписанному
порядок роутеров соблюдай и всё
А зачем перед всем этим проверять на админа?
Офис менеджер и управляющий. Две роли. Одна команда, два хендлера, через одну пройдет один, через вторую другой. Хочу в бд не давать каждому отдельно привелегии, а закинуть права офис менеджера офис менеджеру и если админ прошел проверку по фильтру админа, то и админу.
Обсуждают сегодня