Skip to content

Добавить middleware для обработки запросов #63

Description

@ZhuchkaTriplesix

Описание задачи

Реализовать слой middleware, позволяющий добавлять перехватчики запросов к TelegramBot, например, для логирования, rate-limiting, профилирования, контроля ошибок и метрик.

Требования

  1. Интерфейс для подключения кастомных middleware:

    • Прописать стандартный интерфейс для middleware функций
    • Определить порядок вызова middleware (например, в виде цепочки)
    • Обеспечить возможность передачи контекста между middleware
  2. Примеры middleware:

    • loggingMiddleware — логирование входящих запросов и ответов
    • rateLimitMiddleware — ограничение частоты запросов от пользователей
    • errorHandlerMiddleware — централизованная обработка ошибок
    • Другие примеры по необходимости
  3. Регистрация middleware:

    • Возможность регистрации нескольких middleware на этапе конфигурации бота
    • Гибкая настройка порядка выполнения

Ожидаемый результат

  • Реализованный механизм middleware с возможностью регистрации на этапе инициализации бота
  • Кодовые примеры использования базовых middleware
  • Рекомендации по применению и расширению функционала
  • Документация с описанием интерфейса и примерами

Пример использования

# Пример определения middleware
async def loggingMiddleware(handler, event, data):
    logger.info(f"Incoming request: {event}")
    result = await handler(event, data)
    logger.info(f"Response sent: {result}")
    return result

async def rateLimitMiddleware(handler, event, data):
    user_id = event.from_user.id
    if not check_rate_limit(user_id):
        return "Too many requests. Please try again later."
    return await handler(event, data)

async def errorHandlerMiddleware(handler, event, data):
    try:
        return await handler(event, data)
    except Exception as e:
        logger.error(f"Error processing request: {e}")
        return "An error occurred. Please try again."

# Регистрация middleware при конфигурации бота
bot = Bot(token=TOKEN)
dp = Dispatcher()

dp.message.middleware(loggingMiddleware)
dp.message.middleware(rateLimitMiddleware)
dp.message.middleware(errorHandlerMiddleware)

Дополнительные рекомендации

  • Использовать async/await для поддержки асинхронной обработки
  • Обеспечить возможность передачи дополнительных параметров в middleware
  • Предусмотреть механизм отмены дальнейшей обработки запроса
  • Добавить unit-тесты для проверки работы middleware

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions