Задать вопрос
@F3ANG

Как правильно строить обработчик колбэков(callback_query_handler) в библиотеке aiogram?

Учусь делать ботов в телеграм`e с помощью библиотеки aiogram, нужна помощь более опытного разработчика в разборе правильного построения обработчика колбэков(callback_query_handler).

Есть сформулированный хэндлер(обработчик сообщений) который отвечает на команду 'random' сообщением "Нажмите на кнопку, чтобы бот отправил число от 1 до 10" и инлайн-кнопкой 'Нажми меня', которая после нажатия отправляет пользователю случайное число от 1 до 10.

Сам хэндлер:

@dp.message_handler(commands="random")
async def cmd_random(message: types.Message):
    keyboard = types.InlineKeyboardMarkup()
    keyboard.add(types.InlineKeyboardButton(text="Нажми меня", callback_data="random_value"))
    await message.answer("Нажмите на кнопку, чтобы бот отправил число от 1 до 10", reply_markup=keyboard)


Но формулировка обработчика колбэков для него не однозначна для меня, потому что я написал два обработчика(с серьезными, в моем понимании, различиями), которые отправляют эквивалентные(визуально) ответы:

1.
@dp.callback_query_handler(text="random_value")
async def send_random_value(call: types.CallbackQuery):
    await call.message.answer(str(randint(1, 10)))


2.
@dp.callback_query_handler(lambda c: c.data == "random_value")
async def send_random_value(message: types.Message):
    await bot.send_message(message.from_user.id,(str(randint(1, 10))))


Я буду очень благодарен, если вы мне поможете глубоко разобраться в правильном построении обработчика колбэков, да и в общем в этой библиотеке. Заранее благодарю вас за потраченное на этот вопрос время.

P.s. я недавно начал изучать программирование в целом, поэтому попрошу быть снисходительнее и отнестись с пониманием.
  • Вопрос задан
  • 13714 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Разницы нет, в принципе, даже в офф. примере указаны они так:

@dp.callback_query_handler(text='no')  # if cb.data == 'no'
@dp.callback_query_handler(text='yes')  # if cb.data == 'yes'


https://github.com/aiogram/aiogram/blob/master/exa...

text более короткий и удобный, хотя, лично меня он сбивает немного с толку. lambda выражение можно использовать для более гибких настроек, которых нет во встроенных фильтрах. Обо всех встроенных фильтрах можно посмотреть тут:

https://docs.aiogram.dev/en/latest/dispatcher/filt...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы