Ошибка ValueError в aiogram 2
Имеется такой код:
async def get_login(message: types.Message, state=dp.current_state()):
user_id = message.from_user.id
await state.update_data(user_id=user_id)
await state.update_data(user_login=message.text)
await message.bot.send_message(user_id, "Теперь введи свой пароль:")
# Сбрасываем состояние
await state.reset_state()
# Регистрируем обработчик ответа на пароль
await dp.register_message_handler(get_password, state="waiting_for_password")
async def get_password(message: types.Message, state=dp.current_state()):
user_login = (await state.get_data()).get('login')
user_id = message.from_user.id
user_credentials[user_id] = (user_login, message.text)
await message.bot.send_message(user_id, "Спасибо! Давай проверим твои данные.")
# Сбрасываем состояние
state_data = await state.get_data()
user_id = state_data.get("user_id")
if user_id in user_credentials:
user_login, user_password = user_credentials[user_id]
await message.answer(user_id, f"Твой профиль {response.get_profile(user_login, user_password)}?", reply_markup=keyboard)
При запуске жалуется на функцию get_login()
и выдает ошибку ValueError:
useror
chat parameter is required but no one is provided!
. Не понимаю в чем дело. Помогите пожалуйста.
Полный текст ошибки:
Traceback (most recent call last):
File "/Users/user/Desktop/moodle bot/BOT/BotMain.py", line 43, in <module>
async def get_login(message: types.Message, state=dp.current_state()):
File "/Users/user/Desktop/moodle bot/venv/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 1261, in current_state
return FSMContext(storage=self.storage, chat=chat, user=user)
File "/Users/user/Desktop/moodle bot/venv/lib/python3.9/site-packages/aiogram/dispatcher/storage.py", line 295, in __init__
self.chat, self.user = self.storage.check_address(chat=chat, user=user)
File "/Users/user/Desktop/moodle bot/venv/lib/python3.9/site-packages/aiogram/dispatcher/storage.py", line 56, in check_address
raise ValueError('`user` or `chat` parameter is required but no one is provided!')
ValueError: `user` or `chat` parameter is required but no one is provided!
Ответы (1 шт):
Ошибка возникает из за того что при создании экземпляра FSMContext
(который используется в dp.current_state()
) не передается ни один из обязательных параметров user
или chat
.
В вашем случае, вы пытаетесь использовать dp.current_state()
внутри определения функции get_login()
, но на момент ее определения еще нет информации о пользователе или чате.
Чтобы исправить ошибку, уберите state=dp.current_state()
из определения функции get_login()
и добавьте его в качестве параметра при регистрации обработчика сообщений.
Мой вариант:
async def get_login(message: types.Message):
user_id = message.from_user.id
# Создаем состояние и получаем его экземпляр
state = dp.current_state(user=user_id)
await state.update_data(user_id=user_id)
await state.update_data(user_login=message.text)
await message.bot.send_message(user_id, "Теперь введи свой пароль:")
# Сбрасываем состояние
await state.reset_state()
# Регистрируем обработчик ответа на пароль
await dp.register_message_handler(get_password, state="waiting_for_password", user_id=user_id)