Найти в Дзене
Computer Pro

Телеграмм-бот на AIOGram. От простого, к сложному. Часть 4

Фото для карточки. Река Кудьма, сентябрь 2024г. Фото автора.
Фото для карточки. Река Кудьма, сентябрь 2024г. Фото автора.

Не буду постить много ссылок на предыдущие статьи этого цикла, всего лишь одна - предыдущая:

Сегодня поговорим о MiddleWare в телеграмм-боте.

-2

Как оказалось, мидлвары бывают разные (черные, белые, красные, навеяло из древноге творчества...) - внешние (outer) на входе и внутренние (inner) на выходе, а между ними то, на что сработал хэндлер, колбэк или запрос.

Зачем нужнен этот MiddleWare?

Есть такая задача при написании хорошего кода: DRY (Don't Repeat Yourself) или "НЕ ПОВТОРЯЙСЯ". Если ты написал какой-то код и такой же код будет использоваться в других задачах - есть смысл вынести его в отдельный файл в директорию middlewares.

Приведу пример который ничего полезного не делает, просто демонстрирует работу мидлвэйр, его код:

-3

И как этот код использовать, скажем, при /start:

-4

Посмотрим, как это работает в боте:

-5

То есть хэндлер сработал на /start, миддлвэйр отработал выдав надпись в консоли (я вопсользовался принтом, но можно было и logger использовать), затем отработал хэндлер, выведя в чат сообщение с inline-клавиатурой, и затем снова выдал надпись. Работа middleware чем-то похожа на работу декоратора в python.

Но это бестолковый пример middleware, ибо данный код ничего полезного не выполняет.

Но, можно например с помощью middleware банить нежелательных пользователей. В телеграмм id-пользователя уникален и даётся один раз при регистрации, вот можно создать таблицу в базе данных таких "забаненных" пользовалей и проверять есть ли там такие. Сам запрос к БД не делаю но выглядеть он должен примерно так:

user = select(BlackList).where(BlackList.user_id == user.id).scalars().one

Если пользователь найден в "черном списке" , то юзер в бот не пускается, выдается ему сообщение (там в принципе может быть не только текст но и какая нибудь злая картинка).

У меня вот такая миддлварь нарисовалась:

-6

Вставляется она аккурат на хендлер старта бота, и если какой либо пользователь нажмет /start пытаясь зайти в бота - мы ему мессэдж:

-7

В middleware можно передавать параметры, такие например как "время задержки", через def __init(self):

-8

А затем, при вызове миддлваря, можно это "время задержки" менять или писать свои параметры...

-9
 У меня подключено сразу два миддлваря, отрабатывают оба
У меня подключено сразу два миддлваря, отрабатывают оба

Ну вот пожалуй и всё что я хотел сегодня написать про миддлвари. Всем пока.

Слава Богу!