Как передать переменную из одного хендлера в другой 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 шт):

Автор решения: Agnumen

На самом деле всё гораздо проще:

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 и задача бы решилась. Надеюсь было полезно!

→ Ссылка