Middleware и внедрение зависимостей¶
Middleware оборачивает обработку события и получает следующий handler, текущее событие и изменяемый словарь данных.
from collections.abc import Awaitable, Callable
from typing import Any
from pyromax import Dispatcher
from pyromax.dispatcher.middlewares.base import BaseMiddleware
from pyromax.dispatcher.event import MaxObject
class RequestContext:
pass
class ContextMiddleware(BaseMiddleware):
async def __call__(
self,
handler: Callable[[MaxObject, dict[type[Any] | str, Any]], Awaitable[Any]],
event: MaxObject,
data: dict[type[Any] | str, Any],
) -> Any:
data[RequestContext] = RequestContext()
return await handler(event, data)
dispatcher = Dispatcher()
dispatcher.update.outer_middleware(ContextMiddleware())
После этого объект доступен по аннотации:
@dispatcher.message()
async def handle(context: RequestContext) -> None:
...
Внешние middleware и middleware observer¶
Внешнее middleware Dispatcher окружает разрешение update и все routed handlers. Middleware observer относится к конкретному типу события. Цепочка входит в middleware в порядке регистрации, а выходит в обратном порядке.
Встроенные middleware Dispatcher¶
По умолчанию устанавливаются:
ErrorsMiddlewareдля передачи ошибок;UserContextMiddlewareдля контекста пользователя и чата;FSMContextMiddleware, если не заданоdisable_fsm=True.
Всегда вызывайте и возвращайте await handler(event, data), если middleware не должно намеренно остановить распространение события.