Перейти к содержанию

Middleware

Примеры пользовательских middleware.

Логирование

import time
import logging
from typing import Any
from collections.abc import Awaitable, Callable
from maxgram import BaseMiddleware
from maxgram.types import MaxObject

logger = logging.getLogger(__name__)

class LoggingMiddleware(BaseMiddleware):
    async def __call__(
        self,
        handler: Callable[[MaxObject, dict[str, Any]], Awaitable[Any]],
        event: MaxObject,
        data: dict[str, Any],
    ) -> Any:
        start = time.monotonic()
        result = await handler(event, data)
        duration = time.monotonic() - start
        logger.info("Handler completed in %.3fs", duration)
        return result

# Регистрация
router.message.outer_middleware(LoggingMiddleware())

Авторизация

class AuthMiddleware(BaseMiddleware):
    def __init__(self, allowed_user_ids: set[int]):
        self.allowed_user_ids = allowed_user_ids

    async def __call__(self, handler, event, data):
        user = data.get("event_from_user")
        if user and user.user_id not in self.allowed_user_ids:
            return  # Игнорируем неавторизованных
        return await handler(event, data)

router.message.outer_middleware(
    AuthMiddleware(allowed_user_ids={123456, 789012})
)

Инъекция данных

class DatabaseMiddleware(BaseMiddleware):
    def __init__(self, db_pool):
        self.db_pool = db_pool

    async def __call__(self, handler, event, data):
        async with self.db_pool.acquire() as conn:
            data["db"] = conn
            return await handler(event, data)

# В обработчике
@router.message()
async def handler(message, bot, db):
    result = await db.fetch("SELECT * FROM users")