Репост из: 🇺🇦Розробка Телеграм ботів на Python
⚙️ Перехід до aiogram v3.
Частина 2.
⬅️Читати частину 1 про Роутери.
🇷🇺 Версия в комментариях
Продовжую розповідати про фічі третьої версії, та одна з них — це оновлена фабрика для роботи з інлайн-кнопками.
Взагалі, створення інлайн-кнопок в нової версії теж трохи перероблено, тепер в нас додатково є крутий InlineKeyboardBuilder, та про все це детальніше можна почитати знову в посібнику від Groosha🍐.
🛑 2. Фабрика Callback-ов 🛑
🔗Документація
❔ Для чого воно потрібно?
Коли ви створюєте інлайн-кнопки, то вони часто можуть мати дуже схожий набір даних. Наприклад, коли ми працюємо з меню керування чимось, то в вас кнопки будуть розрізнятись тільки аргументом необхідної дії (edit/add/delete), а менюшка буде мати спільну назву, наприклад manage. Тоді ці кнопки треба якось зручно упакувати.
ℹ️ Хто вже знайомий з фабрикою 2-версії, той знає наскільки вона зручна — для створення callback_data замість простого тексту ви послуговуєтесь пітоновськими об'єктами, завдяки чому:
🛑потім в IDE можлива зручна навігація: натискаємо на об'єкт з кнопки — переходимо к місцю, де він використовується.
🛑Не треба робити callback_query.data.split()[-1] і подібне, а ви в хендлер отримуєте вже створений словник з даними, які були передані в кнопки. Дуже зручно їх діставати по ключах, зрозуміло виглядає код!
🛑Вбудований зручний фільтр для хендлерів, через метод .filter(), тоді aiogram точно не переплутає з іншими хендлерами.
👎Але були і певні мінуси:
🛑Не дуже зручно працювати, якщо треба в вас є опціональні аргументи, тобто порожні.
🛑В новачків виникає плутанина зі створенням об'єкту, тому що вони не відрізняють префікс від аргументів
🛑Всі дані в сформованому словнику мають тип строки, тому треба потім їх конвертувати в необхідний тип.
🆕 Що нового?
Отже! Тепер створення фабрики виглядає трохи по іншому, та можливо більш зрозуміло буде, плюс ви можете додавати опціональні поля, та пропускати їх і, нарешті, наші дані приходять правильного типу! А ще, тепер нам доступні підказки (тайпіхнти) для аргументів з класу фабрики.
Пам'ятаєте приблизно як створювати об'єкт @dataclass? Тепер ми створюємо об'єкт колбек-дати як окремий клас (а не екземпляр). Давайте зробимо на прикладі меню зміни товарів.
from aiogram.filters.callback_data import CallbackData
class ManageItems(CallbackData, prefix='manage_items'):
action: str
item_id: item_id
disabled: Optional[bool]
action — дія (додати, змінити, вилучити товар).
item_id — ідентифікатор товару.
disabled — додатковий аргумент, якщо ми хочемо заборонити конкретному користувачу якусь дію з товаром.
Тепер залишилось передати в callback_data:
InlineKeyboardButton(text='Змінити', callback_data=ManageItems(action='edit', item_id=item_id))
Після чого, в нас доступний до використання фільтр для хендлеру:
from aiogram import F
@menu_router.callback_query(ManageItems.filter(F.action='edit'))
Як бачите, можемо тут використовувати нову фічу aiogram3 — MagicFilter (про нього пізніше).
Та в хендлер ми можемо прийняти вже сформований (вже не словник) об'єкт ManageItems:
async def edit_some_item(call: CallbackQuery, callback_data: ManageItems):
item_id = callback_data.item_id
if callback_data.disabled:
# Відхилити дію
return
# Щось робимо
#корисне #полезное
Частина 2.
⬅️Читати частину 1 про Роутери.
🇷🇺 Версия в комментариях
Продовжую розповідати про фічі третьої версії, та одна з них — це оновлена фабрика для роботи з інлайн-кнопками.
Взагалі, створення інлайн-кнопок в нової версії теж трохи перероблено, тепер в нас додатково є крутий InlineKeyboardBuilder, та про все це детальніше можна почитати знову в посібнику від Groosha🍐.
🛑 2. Фабрика Callback-ов 🛑
🔗Документація
❔ Для чого воно потрібно?
Коли ви створюєте інлайн-кнопки, то вони часто можуть мати дуже схожий набір даних. Наприклад, коли ми працюємо з меню керування чимось, то в вас кнопки будуть розрізнятись тільки аргументом необхідної дії (edit/add/delete), а менюшка буде мати спільну назву, наприклад manage. Тоді ці кнопки треба якось зручно упакувати.
ℹ️ Хто вже знайомий з фабрикою 2-версії, той знає наскільки вона зручна — для створення callback_data замість простого тексту ви послуговуєтесь пітоновськими об'єктами, завдяки чому:
🛑потім в IDE можлива зручна навігація: натискаємо на об'єкт з кнопки — переходимо к місцю, де він використовується.
🛑Не треба робити callback_query.data.split()[-1] і подібне, а ви в хендлер отримуєте вже створений словник з даними, які були передані в кнопки. Дуже зручно їх діставати по ключах, зрозуміло виглядає код!
🛑Вбудований зручний фільтр для хендлерів, через метод .filter(), тоді aiogram точно не переплутає з іншими хендлерами.
👎Але були і певні мінуси:
🛑Не дуже зручно працювати, якщо треба в вас є опціональні аргументи, тобто порожні.
🛑В новачків виникає плутанина зі створенням об'єкту, тому що вони не відрізняють префікс від аргументів
🛑Всі дані в сформованому словнику мають тип строки, тому треба потім їх конвертувати в необхідний тип.
🆕 Що нового?
Отже! Тепер створення фабрики виглядає трохи по іншому, та можливо більш зрозуміло буде, плюс ви можете додавати опціональні поля, та пропускати їх і, нарешті, наші дані приходять правильного типу! А ще, тепер нам доступні підказки (тайпіхнти) для аргументів з класу фабрики.
Пам'ятаєте приблизно як створювати об'єкт @dataclass? Тепер ми створюємо об'єкт колбек-дати як окремий клас (а не екземпляр). Давайте зробимо на прикладі меню зміни товарів.
from aiogram.filters.callback_data import CallbackData
class ManageItems(CallbackData, prefix='manage_items'):
action: str
item_id: item_id
disabled: Optional[bool]
action — дія (додати, змінити, вилучити товар).
item_id — ідентифікатор товару.
disabled — додатковий аргумент, якщо ми хочемо заборонити конкретному користувачу якусь дію з товаром.
Тепер залишилось передати в callback_data:
InlineKeyboardButton(text='Змінити', callback_data=ManageItems(action='edit', item_id=item_id))
Після чого, в нас доступний до використання фільтр для хендлеру:
from aiogram import F
@menu_router.callback_query(ManageItems.filter(F.action='edit'))
Як бачите, можемо тут використовувати нову фічу aiogram3 — MagicFilter (про нього пізніше).
Та в хендлер ми можемо прийняти вже сформований (вже не словник) об'єкт ManageItems:
async def edit_some_item(call: CallbackQuery, callback_data: ManageItems):
item_id = callback_data.item_id
if callback_data.disabled:
# Відхилити дію
return
# Щось робимо
#корисне #полезное