FSM без 49 страниц: понять за 10 минут
Главная идея простая: бот должен помнить на каком шаге находится пользователь и что он уже ввёл раньше.
Одно сообщение — разный смысл
Попробуй переключить этап
Что добавляет FSM?
Без FSM бот видит только отдельные сообщения:
"17"
"Мужской"
С FSM к каждому сообщению добавляется контекст:
input_age → "17" → возраст
choose_gender → кнопка → пол
STATE = где мы сейчас
Отвечает на вопрос: что пользователь должен сделать прямо сейчас?
DATA = что уже запомнили
Отвечает на вопрос: что пользователь уже ввёл на предыдущих шагах?
FSM — это маршрут из состояний
input_name → input_age → choose_gender → confirmationПройди регистрацию сам
🧠 Память бота
Сначала отправьте /startПочти каждый шаг FSM — 5 действий
value = message.textif ошибка: ...state.add_data(...)state.set(...)bot.send_message(...)Минимальный пример обработчика возраста
# работает только на этапе ввода возраста
@bot.message_handler(state=RegistrationStates.input_age, content_types=["text"])
def process_state_input_age(message, state):
try:
age = int(message.text.strip())
except:
bot.send_message(message.chat.id, "Введите возраст числом")
return
if age < 13 or age > 100:
bot.send_message(message.chat.id, "Возраст должен быть от 13 до 100")
return
state.add_data(age=age)
state.set(RegistrationStates.choose_gender)
bot.send_message(message.chat.id, "Выберите пол")
Ошибка не двигает пользователя дальше
❌ Пользователь пишет «Привет»
state = input_ageПреобразовать в int нельзя.
✅ Бот отвечает об ошибке
returnФункция остановилась, поэтому state остаётся input_age. Можно попробовать снова.
Состояние работает как маршрутизатор
state=... — только на нужном этапе.state = input_namestate = input_agestate = choose_genderprocess_state_input_name()process_state_input_age()process_state_choose_gender()У каждого пользователя — своя память
👥 Маша и Петя могут быть на разных шагах
Один бот одновременно ведёт много независимых диалогов.
state = input_agestate = input_name⚠️ StateMemoryStorage — временная память
В учебном проекте состояние хранится в оперативной памяти. Перезапустили Python-программу — состояния и данные исчезли.
# удобно для обучения, но не для постоянного хранения
4 вопроса перед каждым новым состоянием
Где пользователь сейчас?
input_ageЧто он должен отправить?
Что нужно сохранить?
ageКакое состояние следующее?
choose_genderПонял ли ты FSM?
1. Что хранит state?
2. Что делает state.add_data(age=17)?
3. Возраст введён неверно. Что лучше сделать?
4. Почему для Inline-кнопки нужен callback handler?
Три задания по нарастающей
Доделать confirmation
Accept → завершить регистрацию и удалить state. Error → начать заново.
state.delete()Добавить город
Новое состояние между возрастом и выбором пола.
input_city = State()Исправлять только одно поле
Из confirmation возвращаться именно к имени, возрасту или полу, а не начинать всё заново.
confirmation → input_ageЕсли запомнить только 3 вещи
где пользователь сейчасчто он уже ввёлсохранили → state.set(next)