Машина состояний(FSM) в Aiogram
Есть некий класс,с набором стейтов
class CellarImport(StatesGroup):
item = State()
volume = State()
count = State()
И дело в том что при попытке пройтись по хендлерам через стейты с помощью соответсвующей команды
@dp.message_handler(commands=['add'], state=None)
async def enter_item(message: types.Message):
await message.answer('Как назовёте позицию?')
await CellarImport.item.set()
@dp.message_handler(state=CellarImport.item)
async def enter_volume(message: types.Message, state: FSMContext):
answer = message.text
await state.update_data(answer1=answer)
await message.answer('Объём?')
await CellarImport.volume.set()
@dp.message_handler(state=CellarImport.volume)
async def enter_volume(message: types.Message, state: FSMContext):
answer = message.text
await state.update_data(answer2=answer)
await message.answer('Количество?')
await CellarImport.count.set()
Как это исправить?
Ответы (1 шт):
Автор решения: Oleg
→ Ссылка
Ошибка говорит о том, что вы не указали хранище storage
Описание
aiogram поддерживает работу как с временным локальным хранилищем (оперативная память), так и с множеством внешних (redis, memcache, mongodb, rethinkdb и т.д.)
Пример
Для подключения локального хранилища:
- Создайте объект хранилища:
from aiogram.contrib.fsm_storage.memory import MemoryStorage
storage = MemoryStorage()
- При создании объекта класса
Dispatcherпередайте объект хранилищя в параметрstorage
dp = Dispatcher(bot, storage=storage)
Важно!
Хранилище MemoryStorage будет терять все данные после перезагрузи приложения. Для независимого хранения данных используйте внешние хранилища. Способ их подключения отличается только необходимостью передачи настроек при создании объекта.
from aiogram.contrib.fsm_storage.redis import RedisStorage2
storage = RedisStorage2(
host=REDIS_HOST,
port=REDIS_PORT,
db=REDIS_DB,
password=REDIS_PASSWORD,
# и т.д.
)
