diff --git a/aiogram/dispatcher/handler.py b/aiogram/dispatcher/handler.py index 38219012..a1831c50 100644 --- a/aiogram/dispatcher/handler.py +++ b/aiogram/dispatcher/handler.py @@ -98,7 +98,11 @@ class Handler: if self.middleware_key: try: - await self.dispatcher.middleware.trigger(f"pre_process_{self.middleware_key}", args + (data,)) + data.update( + await self.dispatcher.middleware.trigger( + f"pre_process_{self.middleware_key}", args + (data,) + ) or {} + ) except CancelHandler: # Allow to cancel current event return results @@ -112,7 +116,11 @@ class Handler: ctx_token = current_handler.set(handler_obj.handler) try: if self.middleware_key: - await self.dispatcher.middleware.trigger(f"process_{self.middleware_key}", args + (data,)) + data.update( + await self.dispatcher.middleware.trigger( + f"process_{self.middleware_key}", args + (data,) + ) or {} + ) partial_data = _check_spec(handler_obj.spec, data) response = await handler_obj.handler(*args, **partial_data) if response is not None: diff --git a/aiogram/dispatcher/middlewares.py b/aiogram/dispatcher/middlewares.py index 5fa09830..bd68c69c 100644 --- a/aiogram/dispatcher/middlewares.py +++ b/aiogram/dispatcher/middlewares.py @@ -41,7 +41,7 @@ class MiddlewareManager: log.debug(f"Loaded middleware '{middleware.__class__.__name__}'") return middleware - async def trigger(self, action: str, args: typing.Iterable): + async def trigger(self, action: str, args: typing.Iterable) -> dict: """ Call action to middlewares with args lilt. @@ -49,8 +49,10 @@ class MiddlewareManager: :param args: :return: """ + data = {} for app in self.applications: - await app.trigger(action, args) + data.update(await app.trigger(action, args) or {}) + return data class BaseMiddleware: @@ -103,7 +105,7 @@ class BaseMiddleware: handler = getattr(self, handler_name, None) if not handler: return None - await handler(*args) + return await handler(*args) class LifetimeControllerMiddleware(BaseMiddleware):