Маршрутизатор#
Usage:
from aiogram import Router
from aiogram.types import Message
my_router = Router(name=__name__)
@my_router.message()
async def message_handler(message: Message) -> Any:
await message.answer('Hello from my router!')
- class aiogram.dispatcher.router.Router(*, name: str | None = None)[source]#
Базується на
object
Маршрутизатор може маршрутизувати події, а також вкладені типи оновлень, такі як повідомлення, запит зворотного виклику, опитування та всі інші типи подій.
Обробники подій можуть бути зареєстровані в обсервері двома шляхами:
За допомогою методу обсервера -
router.<event_type>.register(handler, <filters, ...>)
За допомогою декоратора -
@router.<event_type>(<filters, ...>)
- __init__(*, name: str | None = None) None [source]#
- Параметри:
name – Додаткова назва маршрутизатора, може бути корисною для відлагодження
- include_router(router: Router) Router [source]#
Підключення маршрутизатора.
- Параметри:
router –
- Повертає:
Обсервери подій#
Попередження
Усі обробники завжди мають бути асинхронними. Ім’я функції обробки не має значення. Назва аргументу події також не важлива, але рекомендується не накладати назву на контекстні дані, оскільки функція не може прийняти два аргументи з однаковою назвою.
Ось список доступних обсерверів і приклади того, як зареєструвати обробники
У цих прикладах використовуються лише обробники реєстрації у стилі декоратора, але якщо вам не подобаються @decorators, просто використовуйте <event type>.register(...)
method instead.
Повідомлення#
Увага
Будьте уважні при фільтруванні цієї події
Вам слід очікувати, що ця подія може мати різні набори атрибутів у різних випадках
(Наприклад, текст, стікер та документ завжди мають різні типи вмісту)
Рекомендований спосіб перевірити наявність полів перед використанням, наприклад за допомогою magic filter: F.text
для обробки тексту, F.sticker
для обробки лише стікерів і тощо.
@router.message()
async def message_handler(message: types.Message) -> Any: pass
Відредаговане повідомлення#
@router.edited_message()
async def edited_message_handler(edited_message: types.Message) -> Any: pass
Пост на каналі#
@router.channel_post()
async def channel_post_handler(channel_post: types.Message) -> Any: pass
Відредагований пост на каналі#
@router.edited_channel_post()
async def edited_channel_post_handler(edited_channel_post: types.Message) -> Any: pass
Inline запит#
@router.inline_query()
async def inline_query_handler(inline_query: types.InlineQuery) -> Any: pass
Вибраний результат inline запиту#
@router.chosen_inline_result()
async def chosen_inline_result_handler(chosen_inline_result: types.ChosenInlineResult) -> Any: pass
Запит зворотної відповіді#
@router.callback_query()
async def callback_query_handler(callback_query: types.CallbackQuery) -> Any: pass
Запит підтвердження доставки#
@router.shipping_query()
async def shipping_query_handler(shipping_query: types.ShippingQuery) -> Any: pass
Запит перед оформленням замовлення#
@router.pre_checkout_query()
async def pre_checkout_query_handler(pre_checkout_query: types.PreCheckoutQuery) -> Any: pass
Опитування#
@router.poll()
async def poll_handler(poll: types.Poll) -> Any: pass
Відповідь на опитування#
@router.poll_answer()
async def poll_answer_handler(poll_answer: types.PollAnswer) -> Any: pass
My chat member#
@router.my_chat_member()
async def my_chat_member_handler(my_chat_member: types.ChatMemberUpdated) -> Any: pass
Chat member#
@router.chat_member()
async def chat_member_handler(chat_member: types.ChatMemberUpdated) -> Any: pass
Chat join request#
@router.chat_join_request()
async def chat_join_request_handler(chat_join_request: types.ChatJoinRequest) -> Any: pass
Message reaction#
@router.message_reaction()
async def message_reaction_handler(message_reaction: types.MessageReactionUpdated) -> Any: pass
Message reaction count#
@router.message_reaction_count()
async def message_reaction_count_handler(message_reaction_count: types.MessageReactionCountUpdated) -> Any: pass
Chat boost#
@router.chat_boost()
async def chat_boost_handler(chat_boost: types.ChatBoostUpdated) -> Any: pass
Remove chat boost#
@router.removed_chat_boost()
async def removed_chat_boost_handler(removed_chat_boost: types.ChatBoostRemoved) -> Any: pass
Помилки#
@router.errors()
async def error_handler(exception: types.ErrorEvent) -> Any: pass
Is useful for handling errors from other handlers, error event described here
Вкладені маршрутизатори#
Попередження
- До речі, маршрутизатори можуть бути вкладеними в інші маршрутизатори з деякими обмеженнями:
1. Router CAN NOT include itself 1. Routers CAN NOT be used for circular including (router 1 include router 2, router 2 include router 3, router 3 include router 1)
Приклад:
- name:
module_1
router2 = Router()
@router2.message() …
- name:
module_2
from module_2 import router2
router1 = Router() router1.include_router(router2)
Оновлення#
@dispatcher.update()
async def message_handler(update: types.Update) -> Any: pass
Попередження
The only root Router (Dispatcher) can handle this type of event.
Примітка
Dispatcher already has default handler for this event type, so you can use it for handling all updates that are not handled by any other handlers.
Як це працює?#
Наприклад, диспетчер має 2 маршрутизатори, останній маршрутизатор також має один вкладений маршрутизатор:
У цьому випадку потік розповсюдження оновлення матиме вигляд: