如何在aiogram 3.7的outer_middleware中获取已调用的handler函数名
解决Aiogram中间件获取被调用处理函数名称的问题
你遇到的问题是直接用inspect模块拿到的是被包装后的handler信息,无法直接获取业务处理函数的名称。可以通过以下方式实现需求:
实现思路
- Aiogram会将实际注册的业务处理函数注入到中间件的
data字典中,键为handler - 用
inspect.unwrap解包被装饰器包装过的函数,得到原始函数对象 - 读取原始函数的
__name__属性即可获取清晰的函数名称
修改后的完整代码
from typing import Any, Awaitable, Callable, Dict import logging import inspect from aiogram import BaseMiddleware from aiogram.types import TelegramObject logger = logging.getLogger(__name__) class LoggingMiddleware(BaseMiddleware): async def __call__( self, handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: Dict[str, Any] ) -> Any: result = await handler(event, data) # 获取实际业务处理函数,优先从data中取,否则用传入的handler actual_handler = data.get('handler', handler) # 解包所有包装层,拿到原始函数 original_handler = inspect.unwrap(actual_handler) # 获取函数名称 func_name = original_handler.__name__ logger.debug(f"##THIS IS MOCK LOGGER: 被调用的函数名称: {func_name}") return result
代码说明
data.get('handler', handler):data中的handler是你通过装饰器(如@router.message)注册的业务函数,是最直接的目标对象;如果该键不存在,再使用传入的handler参数做降级处理inspect.unwrap:去除Aiogram装饰器给函数添加的包装层,确保拿到的是你自己定义的原始函数original_handler.__name__:直接获取函数的名称,日志中会显示类似你定义的start_handler、echo_message这类清晰的函数名
内容的提问来源于stack exchange,提问作者Alex-Kalinin-jr
相关产品推荐
相关产品推荐

