You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:12:16