Как передать переменную из одного хендлера в другой aiogram без global переменных
Есть такой хендлер:
@router.callback_query(Pagination.Pagination.filter(F.action.in_(['5', '3', '4', '6', '7', '8', '9', '10', '13', '14', '16'])))
async def pagination_handler(call: CallbackQuery, callback_data: Pagination.Pagination):
data = parse.get_products_criteries(callback_data.action)
await call.message.answer("Успешно")
callback_data.action
является классом в другом файле, который преобразует callback_data в str для вызова функции. А переменную data мне нужно достать в другой хендлер для пагинации.
@router.callback_query(Pagination.Pagination.filter(F.action.in_(["prev", "next", "up"])))
async def pagination_handler(call: CallbackQuery, callback_data: Pagination.Pagination):
#пагинация
await call.message.answer(f"<a href='{data[0][0][1]}'><b> {data[0][0][0]} </b> </a>\n\n Цена: <b> {data[0][0][2]} </b>", reply_markup=Pagination.paginator(), parse_mode="HTML")
Как можно получить переменную data во второй хендлер? (При вызове первого хендлера после ответа изменяется inline-клавиатура и отправляется первое сообщение для пагинации) Я не смог найти FSMcontext или MiddleWare для решения этой задачи на aiogram 3.x.
Ответы (1 шт):
На самом деле всё гораздо проще:
from aiogram import ...
from aiogram.fsm.context import FSMContext
@router.callback_query(Pagination.Pagination.filter(F.action.in_(['5', '3', '4', '6', '7', '8', '9', '10', '13', '14', '16'])))
async def pagination_handler(call: CallbackQuery, callback_data: Pagination.Pagination, state: FSMcontext):
data = parse.get_products_criteries(callback_data.action)
await state.set_data(data)
await call.message.answer("Успешно")
@router.callback_query(Pagination.Pagination.filter(F.action.in_(["prev", "next", "up"])))
async def pagination_handler(call: CallbackQuery, callback_data: Pagination.Pagination, state: FSMcontext):
data = await state.get_data()
await call.message.answer(f"{data}")
Сначала мы задаём с помощью команды
await state.set_data(data)
переменную, а в следующем хендлере мы уже получаем эту data
командой
await state.get_data()
Нужно было передать в аргументы функции state
с ключом FSMcontext
и задача бы решилась. Надеюсь было полезно!