Почему переменная не передается от одного обработчика к другому?

Всем привет! <br/> <pre><code class="python">import asyncio
from aiogram import F, Router
from aiogram import Dispatcher, Bot
from aiogram.filters.command import Command
from aiogram import types
from aiogram.utils.keyboard import ReplyKeyboardBuilder
from aiogram.types import FSInputFile, URLInputFile, BufferedInputFile
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.fsm.state import StatesGroup, State
from aiogram.fsm.context import FSMContext
from aiogram.utils.formatting import Text, Bold
from bot import Bot


router = Router()
dp = Dispatcher()
class Reg(StatesGroup):
    name = State()
    number = State()
    strigka = State()
    time = State()
    yes = State()
    user_id = State()
    register = State()
    ok = State()


@router.callback_query(F.data == 'next')
async def one(callback: types.CallbackQuery, state: FSMContext):
    await state.set_state(Reg.name)
    await callback.message.answer('Как мне тебя называть?')

@router.message(Reg.name)
async def reg_name(message: types.Message, state: FSMContext):
    await state.update_data(name=message.text)
    await state.set_state(Reg.number)
    await message.answer('Напишите Ваш номер телефона')

@router.message(Reg.number)
async def reg_number(message:types.Message, state: FSMContext):
    await state.update_data(number=message.text)
    await state.set_state(Reg.strigka)
    await message.answer('Напишите стрижку')

@router.message(Reg.strigka)
async def reg_strigka(message:types.Message, state: FSMContext):
    await state.update_data(strigka=message.text)
    await state.set_state(Reg.time)
    await message.answer("Напишите удобное время")


@router.message(Reg.time)
async def reg_time
  • 10 ноября 2024 г. 6:03
Ответы на вопрос 2
Ваш код для обработки состояний в `aiogram` выглядит правильно на первый взгляд, и переменные, которые вы сохраняете в состоянии (например, `name`, `number`, `strigka`), должны быть доступны между обработчиками. Однако, давайте проверим несколько потенциальных проблем, чтобы убедиться, что все работает должным образом:

1. **Использование состояния**: Убедитесь, что вы используете одно и то же состояние FSM (Finite State Machine) в каждом обработчике. Если состояние не устанавливается должным образом, переменные могут не сохраняться. В вашем коде это соблюдено.

2. **Завершение и передача данных**: После того, как пользователь введет данные в одном обработчике (например, в `reg_name`), обработчик должен корректно передать управление следующему обработчику. Например, вызывайте `await state.set_state(Reg.number)` после сохранения данных.

3. **Сохранение данных**: Убедитесь, что данные действительно сохраняются. Например, после каждого вызова `update_data`, вы можете добавить отладочный вывод, чтобы проверить сохраненные данные:

```python
@router.message(Reg.name)
async def reg_name(message: types.Message, state: FSMContext):
    await state.update_data(name=message.text)
    data = await state.get_data()
    print("Saved data:", data)  # Добавлено отладочное сообщение
    await state.set_state(Reg.number)
    await message.answer('Напишите Ваш номер телефона')
```

4. **Обработка состояния**: Убедитесь, что пользователи действительно следуют по порядку состояний. Если пользователь может отправить не по порядку сообщения, это может вызвать проблемы с состоянием. Необходимо добавить обработку ошибок или дополнительные фильтры, чтобы предотвратить это.

5. **Проверка на наличие состояния**: Если вы хотите проверить, доступны ли ранее сохраненные переменные в других обработчиках, вы можете получать данные с помощью `await state.get_data()`, как упомянуто выше. Это позволит увидеть, были ли они сохранены.

Пример, как вы можете получить все сохраненные данные в следующем обработчике:

```python
@router.message(Reg.number)
async def reg_number(message: types.Message, state: FSMContext):
    await state.update_data(number=message.text)
    data = await state.get_data()  # Получаем все сохраненные данные
    print("Current data:", data)  # Отладочное сообщение
    await state.set_state(Reg.strigka)
    await message.answer('Напишите стрижку')
```

6. **Ошибки в коде**: Убедитесь, что в вашем коде нет синтаксических ошибок или пропущенных частей. Например, в вашем последнем фрагменте кода обработчик `reg_time` не завершен.

Если вы проверите эти моменты и всё настроено правильно, передача переменных между обработчиками должна работать без проблем.
Перед обработчиком "register" стоит лишний Tab. 
А так вообще если рассматривать это в качестве реального бота, то использовать fsm сомнительная идея, т.к если два клиента подадут заявку до того, как один из них будет принят, то данные отправятся второму клиенту. Если рассматривать это как реальную задачу, то лучше использовать базы данных
Похожие вопросы