Не буду постить много ссылок на предыдущие статьи этого цикла, всего лишь одна - предыдущая:
Сегодня поговорим о MiddleWare в телеграмм-боте.
Как оказалось, мидлвары бывают разные (черные, белые, красные, навеяло из древноге творчества...) - внешние (outer) на входе и внутренние (inner) на выходе, а между ними то, на что сработал хэндлер, колбэк или запрос.
Зачем нужнен этот MiddleWare?
Есть такая задача при написании хорошего кода: DRY (Don't Repeat Yourself) или "НЕ ПОВТОРЯЙСЯ". Если ты написал какой-то код и такой же код будет использоваться в других задачах - есть смысл вынести его в отдельный файл в директорию middlewares.
Приведу пример который ничего полезного не делает, просто демонстрирует работу мидлвэйр, его код:
И как этот код использовать, скажем, при /start:
Посмотрим, как это работает в боте:
То есть хэндлер сработал на /start, миддлвэйр отработал выдав надпись в консоли (я вопсользовался принтом, но можно было и logger использовать), затем отработал хэндлер, выведя в чат сообщение с inline-клавиатурой, и затем снова выдал надпись. Работа middleware чем-то похожа на работу декоратора в python.
Но это бестолковый пример middleware, ибо данный код ничего полезного не выполняет.
Но, можно например с помощью middleware банить нежелательных пользователей. В телеграмм id-пользователя уникален и даётся один раз при регистрации, вот можно создать таблицу в базе данных таких "забаненных" пользовалей и проверять есть ли там такие. Сам запрос к БД не делаю но выглядеть он должен примерно так:
user = select(BlackList).where(BlackList.user_id == user.id).scalars().one
Если пользователь найден в "черном списке" , то юзер в бот не пускается, выдается ему сообщение (там в принципе может быть не только текст но и какая нибудь злая картинка).
У меня вот такая миддлварь нарисовалась:
Вставляется она аккурат на хендлер старта бота, и если какой либо пользователь нажмет /start пытаясь зайти в бота - мы ему мессэдж:
В middleware можно передавать параметры, такие например как "время задержки", через def __init(self):
А затем, при вызове миддлваря, можно это "время задержки" менять или писать свои параметры...
Ну вот пожалуй и всё что я хотел сегодня написать про миддлвари. Всем пока.
Слава Богу!