диспетчер и прицепил к нему роутер, а к роутеру прицепил дочерний роутер
dp = Dispatcher()
dp.include_router(default_router)
default_router.include_router(commands.router)
Навесил фильтр на корневой роутер:
default_router.message.bind_filter(ChatTypeFilter)
Как заставить теперь дочерний роутер (commands.router) "увидеть" этот фильтр?
Ошибка:
aiogram.exceptions.FiltersResolveError: Unknown keyword filters: {'chat_type'}
Фильтр
from typing import Union, List
from aiogram.dispatcher.filters import BaseFilter
from aiogram import types
class ChatTypeFilter(BaseFilter):
chat_type: Union[str, List[str]]
async def __call__(self, message: types.Message) -> bool:
if isinstance(self.chat_type, str):
return message.chat.type == self.chat_type
else:
return message.chat.type in self.chat_type
Могу сделать MRE, если нужно
Так, кажется, я понял, в чём проблема, но не знаю, как решить. Ошибка возникает ещё в момент начала импортов: from bot.handlers import commands async def cmd_start(message: types.Message): В этот момент созданный роутер ничего не знает про фильтр. Поэтому, видимо, надо указывать не кваргом, а прям передавать класс
Обработчики регистрируй после того как зарегистрирован фильтр в фабрике
Да там другая проблема была: я на декораторы передалал и вариант с чисто кваргом перестал работать вообще
Логично, у тебя регистрация обработчиков выполнилась раньше фильтра
В целом советую не использовать фабрику фильтров (кейворды), от них в 3.2-4.0 планирую отказаться Указывай фильтры явным образом
Помню как сам на это напоролся когда писал свой регистратор хендлеров, неочевидная подъёбка.
Могу ошибаться, но ты можешь навесить этот фильтр только для commands.router
Обсуждают сегодня