169 похожих чатов

Добрый день, ребят. Пробую потихоньку перейти на aiogram3. У меня есть

несколько ролей, для которых есть отдельные роутеры. То есть скажем для администратора и для клиента, команда start будет отрабатывать по разному.
Соответственно у них разные роутеры и разные handler'ы.

Как мне реализовать такое распределение по роутерам? Ориентируясь на гайд от Груши - нужно ли мне делать это через middleware, а после вешать его на роутер?

21 ответов

82 просмотра

Мне кажется, здесь правильно сделать outer middleware, в котором прокидывать в апдейт роль юзера, а на каждый роутер навесить фильтр, который будет пропускать только в случае совпадения роли

Андрей-🐍 Автор вопроса
Groosha
Мне кажется, здесь правильно сделать outer middlew...

Отлично! У меня была идея сделать именно так, но я завалился на middleware. Я пытался повесить два middleware на два router'а, это выглядело примерно так: admin_router.message.middleware(FromAdminsMessageMiddleware()) client_router.message.middleware(FromClientMessageMiddleware()) dp.include_router(client_router) dp.include_router(admin_router) В таком случае, проверка будет проходить только на первом router'e, то есть до второго middleware вообще не доходит событие.

Андрей 🐍
Отлично! У меня была идея сделать именно так, но я...

Мидлварь тебе надо повесить на диспетчер (т.е. на корневой роутер)

Андрей-🐍 Автор вопроса

Речь про мою реализацию? Подскажи пожалуйста, как я могу это сделать? Сильно удивился, как много всего изменили в aiogram3 :)

Андрей 🐍
Речь про мою реализацию? Подскажи пожалуйста, как ...

Ну вон я тебе выше рассказал на словах. Кодом не могу, сорян, не у компа

Groosha
Мне кажется, здесь правильно сделать outer middlew...

а почему нельзя все через фильтр сделать?

Ilya Lyapin (Nestyreff)
а почему нельзя все через фильтр сделать?

Так тебе надо в разных роутерах одно и то же проверять. Проще же один раз мидлварью получить данные и прокинуть в кучу разных мест

Андрей-🐍 Автор вопроса
Groosha
Ну вон я тебе выше рассказал на словах. Кодом не м...

Ничего страшного, очень тебе благодарен. Сейчас попробую сам потыкать и разобраться.

Андрей-🐍 Автор вопроса
Groosha
Расскажи потом, пожалуйста, как успехи

Если это не сарказм, то без проблем :)

Андрей-🐍 Автор вопроса
Groosha
Не сарказм)

Мало ли. Здесь любят побуллить всяких ботоё...)

Андрей 🐍
Мало ли. Здесь любят побуллить всяких ботоё...)

Любят, и я тоже :) Но сейчас мне реально интересно. Может получиться хороший use-case

Андрей 🐍
Ничего страшного, очень тебе благодарен. Сейчас по...

Подсказали в соседнем чате: То, что ты прокинул через мидлварь (напр. data[“role”] = “govno”) В фильтре достаётся как аргумент функции (как в хэндлерах), то есть, аргумент role

Андрей-🐍 Автор вопроса

Я в __call__ в фильтре принял это как kwargs и оттуда дёргаю kwargs["role"].

А можно сразу как role

Андрей-🐍 Автор вопроса
Groosha
А можно сразу как role

Да-да, уже поправил :)

Groosha
Тут ещё и keyerror потенциальный

Там в целом тоже ошибка будет, если не будет роли в контексте, только другая)

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
4
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта