Aiogram 3.x.x中路由器连接及main.py代码调整方法
Aiogram 3.x 无装饰器注册命令并连接路由器到Dispatcher的实现
第一步:修改 handlers/common.py
先创建路由器实例,直接调用注册方法绑定cmd_start函数到/start命令,核心是用router.message.register()配合命令过滤器实现无装饰器注册:
from aiogram import Router from aiogram.types import Message from aiogram.filters import Command # 创建路由器实例 router = Router() # 定义/start命令的处理函数 async def cmd_start(message: Message): await message.answer("Hello, world!") # 无装饰器注册:将处理函数与/start命令绑定 router.message.register( cmd_start, Command(commands=["start"]) )
如果需要注册其他命令,重复调用router.message.register(),替换对应的处理函数和过滤器即可。
第二步:修改 main.py
导入定义好的路由器,通过dp.include_router()将路由器挂载到Dispatcher上,完整示例如下:
import asyncio from aiogram import Bot, Dispatcher from aiogram.enums import ParseMode from handlers.common import router # 导入common模块的路由器 # 替换为你的机器人TOKEN BOT_TOKEN = "你的机器人TOKEN" async def main(): bot = Bot(token=BOT_TOKEN, parse_mode=ParseMode.HTML) dp = Dispatcher() # 将路由器连接到Dispatcher dp.include_router(router) # 清空积压的未处理更新(可选,避免机器人启动后收到旧消息) await bot.delete_webhook(drop_pending_updates=True) # 启动长轮询 await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())
关键说明
- Aiogram 3.x的路由器是模块化管理处理函数的核心,每个路由器可独立管理一组相关的命令/消息处理逻辑,最后统一挂载到Dispatcher即可生效。
- 无装饰器注册和装饰器注册的功能完全等价,只是写法更显式,本质都是将处理函数与触发条件(如命令过滤器)绑定到路由器上。
内容的提问来源于stack exchange,提问作者Alexander Grenkov
相关产品推荐
相关产品推荐

