Middleware

litegram предоставляет мощный механизм для настройки обработчиков(handler) событий через промижни программы.

Middleware в фреймворка для ботив похожи на механизм промижних програм в веб-фреймворках, таких как httpx, fastapi, Django и т.д.) с невеликою ризницею – здесь реализовано два уровня промижного програмних програм (к и после фильтрив).

Примечание

Middleware — это функция, которая запускается во время каждой события, полученной от Telegram Bot API в многих точках процесса обработки.

Основные понятия

Как утверждают многие книги и другие источники в интернете:

Middleware — это програма, многократного использования, что використовуе шаблони и фреймворки для ликвидування разрыва между функциональними вимогами приложений и основными операцийними системами, стеками сетевых протоколив и базами данных.

Middleware может изменять, расширять или отклонять подию обработки в многих точках процесса обработки.

Основы

Экземпляр промежуточной программы можно применить для каждого типа события Telegram (обновления, сообщения и т.д.) в двух местах

  1. Внешняя область - перед обработкой фильтрами (<router>.<event>.outer_middleware(...))

  2. Внутренняя область – после обработки фильтрами, но перед обработчиком (handler) (<router>.<event>.middleware(...))

Основы промеждуних програм

Внимание

Middleware имеет быть пидкласом BaseMiddleware (from litegram import BaseMiddleware) или будь-которой асинхронной функциею

Спецификация аргументив

class litegram.dispatcher.middlewares.base.BaseMiddleware[исходный код]

Базовые классы: ABC, Generic

Узагальнений класс промеждуних програм

abstractmethod async __call__(handler: Callable[[T, dict[str, Any]], Awaitable[Any]], event: T, data: dict[str, Any]) Any[исходный код]

Виконання промеждунои программы

Параметры:
  • handler – Обробник (handler), обгорнутий в ланцюжок промеждуних програм

  • event – Вхидна событие (пидклас litegram.types.base.TelegramObject)

  • data – Контекстни дани. Будуть зисивлени с аргуменими обработчика

Результат:

Any

Примери

Опасно

Middleware должны всегда вызывать await handler(event, data) , чтобы передавати подию для наступнои промежуточной программы/обработчика (handler)

Класово ориентований

from litegram import BaseMiddleware
from litegram.types import Message


class CounterMiddleware(BaseMiddleware):
    def __init__(self) -> None:
        self.counter = 0

    async def __call__(
        self,
        handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]],
        event: Message,
        data: Dict[str, Any]
    ) -> Any:
        self.counter += 1
        data['counter'] = self.counter
        return await handler(event, data)

и тогда

router = Router()
router.message.middleware(CounterMiddleware())

Функционально-ориентований

@dispatcher.update.outer_middleware()
async def database_transaction_middleware(
    handler: Callable[[Update, Dict[str, Any]], Awaitable[Any]],
    event: Update,
    data: Dict[str, Any]
) -> Any:
    async with database.transaction():
        return await handler(event, data)

Факти

  1. Middleware из зовнишньои области викликатимуться во время каждой вхиднои события

  2. Middleware из внутришньои области викликатимуться только после проходження фильтрив

  3. Внутришни промижни программы викликають тип события litegram.types.update.Update , через те, что все вхидни обновления надходять к обработчика (handler) певного типа событий через вбудований обработчик (handler) обновлений