From 433fe19bc601f6b6269d4bca7e7c9abdb8977454 Mon Sep 17 00:00:00 2001 From: Mykola Solodukha Date: Fri, 16 Oct 2020 20:00:19 +0300 Subject: [PATCH] :sparkles: Ability to update `data` dict from middlewares returns --- aiogram/dispatcher/handler.py | 12 ++++++++++-- aiogram/dispatcher/middlewares.py | 8 +++++--- 2 files changed, 15 insertions(+), 5 deletions(-) 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):