Как можно передавать переменные в состоянии при использовании AIOGRAM?

Как передавать переменные между хэндлерами в AIOGRAM после последнего обновления? Я знаю, что раньше это можно было сделать через state,proxy(), но не уверен, как теперь это реализовать.
  • 28 сентября 2023 г. 14:47
Ответы на вопрос 4
С начала 7.0 версии AIOGram был полностью переписан, и в новой версии есть иной подход к передаче переменных между хэндлерами. 

Вместо использования `state.proxy()` нужно использовать `dp.current_state()`, и сохранять/получать переменные через `context` объекта хэндлера. 

Пример передачи переменной между хэндлерами:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.dispatcher import FSMContext
from aiogram.contrib.fsm_storage.memory import MemoryStorage

TOKEN = 'your_token'
bot = Bot(token=TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

class MyStateFSM(types.Message):
    some_variable: str

@dp.message_handler(commands=['start'])
async def start(message: types.Message, state: FSMContext):
    await message.answer("Enter your variable:")
    # Сохраняем переменную в состоянии FSM
    await MyStateFSM.some_variable.set()

@dp.message_handler(state=MyStateFSM.some_variable)
async def handle_variable(message: types.Message, state: FSMContext):
    # Получаем переменную из состояния FSM
    variable = message.text

    # Используем переменную
    await message.answer(f"Your variable: {variable}")

    # Сбрасываем состояние FSM
    await state.finish()

if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp)
```

В приведенном выше примере хэндлер `start` сохраняет переменную `some_variable` в состоянии FSM при обработке команды `/start`. Затем, хэндлер `handle_variable` получает эту переменную и использует ее для ответа пользователю. В конце хэндлера `handle_variable` состояние FSM сбрасывается с помощью `state.finish()`.

Вышеуказанный код применяется только для передачи состояний переменной между хэндлерами. Если вам необходимо передавать переменные между различными файлами или модулями, вы можете использовать глобальные переменные или передачу переменных через контекст объекта бота/диспетчера (`bot.context`, `dp.context`).
await state.update_data(pay_amount_text = message.text) 
 Полученное сообщение сохраняется в поле pay_amount_text у состояния.

# Тут ваш другой хэндлер
data = await state.get_data()
crypto_amount = int(data["pay_amount_text"]) 
 Получаем сохраненное значение pay_amount_text и преобразуем его в целое число.
Похожие вопросы