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

Привет, народ) есть у кого-то опыт отлова state через middleware в

aiogram?
например, если бот уже запущен командой /start, то вторая команда /start не будет воспринята

думал через состояния это сделать и именно на уровне middlware для практики)

понимаю, что практически можно и в самом хендлере обработать или через БД сделать...
рассчитываю на элегантное решение)

5 ответов

17 просмотров

Я написал декоратор, которым помечаю определённые хэндлеры, и middleware срабатывает только с теми хэндлерами, у которых есть этот декоратор. Этим декоратором можно обернуть хэндлер /start, чтобы при каждом старте бота срабатывала middleware, проверяющая, есть ли этот пользователь в БД, или нет. Думаю, что не стоит использовать для этого state. В моём боте есть authorization_middlware, где реализована авторизация пользователей по внутренним данным: она срабатывает перед хэндлером, смотрит в БД, а затем передаёт в хэндлер объект с нужными данными о пользователе, либо отменяет хэндлер и перенаправляет на цепочку для авторизации.

Владислав-Сах Автор вопроса
Victor
Я написал декоратор, которым помечаю определённые ...

какая логика фильтрации? что выполняет декоратор? Можно пример кода посмотреть?) если это ок, то можно в лс благодарю

Владислав Сах
какая логика фильтрации? что выполняет декоратор? ...

Декоратор просто устанавливает атрибут функции (функции — это тоже объекты, у них могут быть атрибуты). def user_auth_required(message_handler): setattr(message_handler, 'user_auth_required', True) return message_handler Оборачиваю так: @user_auth_required async def my_handler(message: Message): ...

Victor
Декоратор просто устанавливает атрибут функции (фу...

Мидлварь проверяет, что у хэндлера установлен флаг user_auth_required: class UserAuthorizationMiddleware(BaseMiddleware): @staticmethod async def on_process_message(message: types.Message, data: dict): handler = current_handler.get() if (not handler) or (not getattr(handler, 'user_auth_required', False)): return ...

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта