Как сплитнуть callback_query в aiogram3 на разные файлы?

Как изменить код так, чтобы разные обработчики в разных файлах работали при использовании декоратора @router.callback_query()? Включение только первого обработчика и игнорирование остальных, когда они добавлены в include. В документации я не нашел способ передать декоратору определенное значение, и использование F.text не дает результатов.
  • 12 ноября 2023 г. 10:18
Ответы на вопрос 1
В Aiogram 3 вы можете разделить обработчики на разные файлы, используя модуль `aiogram.dispatcher.filters` для определения фильтра для каждого обработчика.

Вот пример того, как вы можете разделить обработчики на разные файлы:

Файл `main.py`:
```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage

from handlers1 import dp as dp1
from handlers2 import dp as dp2

API_TOKEN = 'your-token'
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
dp1.include_router(dp2)
dp.include_router(dp1)

if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp, skip_updates=True)
```

Файл `handlers1.py`:
```python
from aiogram import types
from aiogram.dispatcher import Dispatcher
from aiogram.dispatcher.filters import Command

from handlers2 import dp


@dp.callback_query_handler(Command('start'))
async def start_command_handler(callback_query: types.CallbackQuery):
    await callback_query.answer('Start handler called')


@dp.callback_query_handler(Command('stop'))
async def stop_command_handler(callback_query: types.CallbackQuery):
    await callback_query.answer('Stop handler called')
    await callback_query.bot.send_message(callback_query.from_user.id, "Stopping...")
```

Файл `handlers2.py`:
```python
from aiogram import types
from aiogram.dispatcher.filters import Command

dp = Dispatcher()


@dp.callback_query_handler(Command('help'))
async def help_command_handler(callback_query: types.CallbackQuery):
    await callback_query.answer('Help handler called')
```

В этом примере, обработчики команды `/start` и `/stop` находятся в файле `handlers1.py`, а обработчик команды `/help` находится в файле `handlers2.py`. 

При запуске `main.py`, все обработчики будут добавлены к глобальному диспетчеру `dp`, и они будут вызываться в соответствии с указанными фильтрами каждого обработчика.

Обратите внимание, что для корректного использования `dp1.include_router(dp2)` и `dp.include_router(dp1)`, в файле `handlers2.py` вы должны определить объект `dp` как глобальную переменную перед определением обработчиков команды `/help`.
Похожие вопросы