← Назад к вопросам

Как происходи переход между состояниями в Aiogram?

1.7 Middle🔥 141 комментариев
#Python Core#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Состояния в Aiogram: Finite State Machine (FSM)

Aiogram использует паттерн Finite State Machine (FSM) для управления состояниями диалога. Переходы между состояниями — это ключевой механизм для создания интерактивных ботов с сложной логикой.

Что такое состояние в Aiogram

Состояние — это логический этап диалога, в котором ожидается определённое действие пользователя. Каждое состояние может иметь свои обработчики команд и сообщений.

Определение состояний

Состояния определяются в виде класса с наследованием от StatesGroup:

from aiogram.fsm.state import State, StatesGroup

class UserForm(StatesGroup):
    waiting_for_name = State()
    waiting_for_email = State()
    waiting_for_age = State()
    confirmation = State()

Переход между состояниями

Переход происходит через FSMContext (контекст состояния), который передаётся в обработчик:

1. Установка состояния

from aiogram import Router, types
from aiogram.fsm.context import FSMContext

router = Router()

@router.message(commands=["start"])
async def start_form(message: types.Message, state: FSMContext):
    await message.answer("Введите ваше имя:")
    await state.set_state(UserForm.waiting_for_name)

2. Обработка сообщений в состоянии

@router.message(UserForm.waiting_for_name)
async def process_name(message: types.Message, state: FSMContext):
    await state.update_data(name=message.text)
    await message.answer("Введите ваш email:")
    await state.set_state(UserForm.waiting_for_email)

3. Доступ к сохранённым данным

@router.message(UserForm.waiting_for_email)
async def process_email(message: types.Message, state: FSMContext):
    await state.update_data(email=message.text)
    data = await state.get_data()
    name = data.get("name")
    email = data.get("email")
    await message.answer(f"Спасибо, {name}! Введите возраст:")
    await state.set_state(UserForm.waiting_for_age)

Полный цикл состояний

@router.message(UserForm.waiting_for_age)
async def process_age(message: types.Message, state: FSMContext):
    await state.update_data(age=message.text)
    data = await state.get_data()
    
    confirmation_text = f"""Проверьте данные:
Имя: {data['name']}
Email: {data['email']}
Возраст: {data['age']}

Всё верно? (да/нет)"""
    
    await message.answer(confirmation_text)
    await state.set_state(UserForm.confirmation)

@router.message(UserForm.confirmation)
async def process_confirmation(message: types.Message, state: FSMContext):
    if message.text.lower() == "да":
        data = await state.get_data()
        await save_user_to_db(data)
        await message.answer("Спасибо! Данные сохранены.")
    else:
        await message.answer("Заполните форму заново.")
    
    await state.clear()

Особенности переходов

Пропуск состояния

if skip_age_verification:
    await state.set_state(UserForm.confirmation)
else:
    await state.set_state(UserForm.waiting_for_age)

Вложенные состояния

class MainForm(StatesGroup):
    choosing_action = State()

class AddressForm(StatesGroup):
    waiting_for_city = State()
    waiting_for_street = State()

await state.set_state(AddressForm.waiting_for_city)

Отмена и очистка

@router.message(commands=["cancel"])
async def cancel_form(message: types.Message, state: FSMContext):
    await state.clear()
    await message.answer("Форма отменена.")

Хранение данных

Данные в контексте хранятся в памяти (по умолчанию) или в БД (при настройке RedisStorage). Это позволяет:

  • Сохранять информацию между сообщениями
  • Восстанавливать форму при перезагрузке бота
  • Распределять нагрузку в многопроцессной архитектуре

Итого

Переходы в Aiogram — это простой и мощный механизм для управления диалогом в телеграм-ботах. Они обеспечивают чистый и предсказуемый поток взаимодействия с пользователем.