Ошибка KeyError при state.finish() бот aiogram python
Машина состояний работает, но выдает ошибку KeyError при завершении состояния state.finish(), даже при проверке на примере из исходной документации aiogram. Лезть в исходник библиотеки и менять код метода _cleanup не выход. Может документация не полная, что он не добавляет ключи chat.id и user.id, и есть способ нормально решить эту проблему? Спасибо за ответ!
Ссылка на код из документации(строка 125): https://docs.aiogram.dev/en/latest/examples/finite_state_machine_example.html
Текст ошибки:
future: <Task finished coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py:409> exception=KeyError(1820871918)>
Traceback (most recent call last):
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 417, in _process_polling_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 238, in process_updates
return await asyncio.gather(*tasks)
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 259, in process_update
return await self.message_handlers.notify(update.message)
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "testing.py", line 100, in process_gender
await state.finish()
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\storage.py", line 322, in finish
await self.storage.finish(chat=self.chat, user=self.user)
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\dispatcher\storage.py", line 202, in finish
await self.reset_state(chat=chat, user=user, with_data=True)
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\contrib\fsm_storage\memory.py", line 78, in reset_state
self._cleanup(chat, user)
File "C:\Users\PyHS\Desktop\te\venv\lib\site-packages\aiogram\contrib\fsm_storage\memory.py", line 108, in _cleanup
if self.data[chat][user] == {'state': None, 'data': {}, 'bucket': {}}:
KeyError: 1820871918
Мой код:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.dispatcher import filters
from aiogram.utils import executor
import aiogram.utils.markdown as md
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.types import ParseMode
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, \
InlineKeyboardMarkup, InlineKeyboardButton
import sqlite3 as sq
import string, json
ID = None
TOKEN = '1111'
bot = Bot(token=TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())
class Form(StatesGroup):
photo = State()
name = State()
price = State()
@dp.message_handler(commands=['Загрузить'])
async def cmd_start(message: types.Message):
if message.from_user.id == ID:
await Form.photo.set()
await message.reply("Загрузи фото")
@dp.message_handler(state='*', commands='cancel')
@dp.message_handler(Text(equals='отмена', ignore_case=True), state='*')
async def cancel_handler(message: types.Message, state: FSMContext):
if message.from_user.id == ID:
current_state = await state.get_state()
if current_state is None:
return
await state.finish()
await message.reply('ОК')
@dp.message_handler(content_types=['photo'], state=Form.photo)
async def load_photo(message: types.Message, state: FSMContext):
if message.from_user.id == ID:
async with state.proxy() as data:
data['photo'] = message.photo[0].file_id
await Form.next()
await message.reply("Теперь введи название")
@dp.message_handler(state=Form.name)
async def load_name(message: types.Message, state: FSMContext):
if message.from_user.id == ID:
async with state.proxy() as data:
data['name'] = message.text
await Form.next()
await message.reply("Введи описание")
@dp.message_handler(state=Form.price)
async def load_price(message: types.Message, state: FSMContext):
if message.from_user.id == ID:
async with state.proxy() as data:
data['price'] = float(message.text)
#отправка словаря в функцию записывающую в бд
await sql_add_command(state)
await state.finish()
executor.start_polling(dp, skip_updates=True)