Маркери#
Маркери це, так звані мітки для обробників, які можна використовувати міддлварах або в спеціальних утилітах щоб провести класифікацію обробників.
Маркери можна додати до обробника через декоратори, реєстрацію обробників або фільтри.
Через декоратори#
Наприклад, відмітимо обробник маркером chat_action
from aiogram import flags
@flags.chat_action
async def my_handler(message: Message)
Або просто для рейт-ліміту чи чогось іншого
from aiogram import flags
@flags.rate_limit(rate=2, key="something")
async def my_handler(message: Message)
Через метод реєстрації обробника#
@router.message(..., flags={'chat_action': 'typing', 'rate_limit': {'rate': 5}})
Через фільтри#
class Command(Filter):
...
def update_handler_flags(self, flags: Dict[str, Any]) -> None:
commands = flags.setdefault("commands", [])
commands.append(self)
Використовувати в міддлварах#
- aiogram.dispatcher.flags.check_flags(handler: HandlerObject | Dict[str, Any], magic: MagicFilter) Any [source]#
Check flags via magic filter
- Параметри:
handler – handler object or data
magic – instance of the magic
- Повертає:
the result of magic filter check
- aiogram.dispatcher.flags.extract_flags(handler: HandlerObject | Dict[str, Any]) Dict[str, Any] [source]#
Extract flags from handler or middleware context data
- Параметри:
handler – handler object or data
- Повертає:
dictionary with all handler flags
- aiogram.dispatcher.flags.get_flag(handler: HandlerObject | Dict[str, Any], name: str, *, default: Any | None = None) Any [source]#
Get flag by name
- Параметри:
handler – handler object or data
name – name of the flag
default – default value (None)
- Повертає:
value of the flag or default
Приклад в міддлварах#
async def my_middleware(handler, event, data):
typing = get_flag(data, "typing") # Check that handler marked with `typing` flag
if not typing:
return await handler(event, data)
async with ChatActionSender.typing(chat_id=event.chat.id):
return await handler(event, data)
Використання в утилітах#
Наприклад, ви можете зібрати всі зареєстровані команди з описом обробника, а потім його можна використовувати для створення довідки щодо команд
def collect_commands(router: Router) -> Generator[Tuple[Command, str], None, None]:
for handler in router.message.handlers:
if "commands" not in handler.flags: # ignore all handler without commands
continue
# the Command filter adds the flag with list of commands attached to the handler
for command in handler.flags["commands"]:
yield command, handler.callback.__doc__ or ""
# Recursively extract commands from nested routers
for sub_router in router.sub_routers:
yield from collect_commands(sub_router)