Aiogram 3 da FSM Ishlatish: 5 Amaliy Best Practice Qoidasi
Muallif: Javohir Abdullayev · · Telegram botlar

Telegram Botlarda FSM Nega Muhim?
Telegram bot yaratish jarayonida eng ko'p uchraydigan vazifalardan biri bu foydalanuvchidan ketma-ket ma'lumot olishdir. Ro'yxatdan o'tish, ariza qoldirish, buyurtma berish yoki so'rovnoma to'ldirish kabi jarayonlarda bot foydalanuvchining ayni damda qaysi bosqichda turganini eslab qolishi kerak. Aynan shu vazifani Finite State Machine (FSM), ya'ni chekli holatlar mashinasi bajaradi.
Ko'plab yangi boshlovchilar Aiogram 3 da FSM bilan ishlashda bir qator arxitektura xatolariga yo'l qo'yishadi. Natijada bot serveri qayta yuklanganda ma'lumotlar yo'qoladi, foydalanuvchilar qotib qolgan holatlarda tiqilib qoladi yoki xotira asossiz to'lib ketadi. Ushbu maqolada ishlab chiqarish (production) muhitida FSM'dan to'g'ri foydalanish bo'yicha 5 ta eng muhim best practice amaliyotini ko'rib chiqamiz.
1. Production Uchun Faqat RedisStorage Ishlating
Aiogram standart holatda MemoryStorage taqdim etadi. Bu usul loyihani mahalliy kompyuterda sinash uchun qulay bo'lsa-da, real loyihalarda jiddiy xavf tug'diradi. Agar server qayta yoqilsa yoki bot yangilansa, xotiradagi barcha foydalanuvchi holatlari o'chib ketadi.
Bundan tashqari, bir nechta jarayonlar (multiprocessing) yoki vebhook rejimida klaster ishlatilganda xotira bo'linadi va foydalanuvchi qaysi jarayonga tushishiga qarab o'z holatini yo'qotishi mumkin. Buning oldini olish uchun doimo RedisStorage ishlatish zarur:
from aiogram import Bot, Dispatcher
from aiogram.fsm.storage.redis import RedisStorage
from redis.asyncio import Redis
redis = Redis(host='localhost', port=6379, db=1)
storage = RedisStorage(redis=redis)
dp = Dispatcher(storage=storage)Redis yordamida har bir holat xavfsiz saqlanadi, server qayta ishga tushsa ham bot to'xtagan joyidan davom etaveradi.
2. Holatni Bekor Qilish (Cancel) Mexanizmini Unutmang
Bot yaratuvchilar tez-tez yo'l qo'yadigan eng katta xatolardan biri bu foydalanuvchini holatdan chiqarish yo'lini ko'zda tutmaslikdir. Foydalanuvchi ro'yxatdan o'tishni boshlab, o'rtada fikridan qaytishi mumkin. Agar siz bekor qilish tugmasi yoki komandasini yaratmasangiz, bot boshqa hech qanday tugmaga javob bermay, doimiy ravishda kutilayotgan qadam ma'lumotini talab qilaveradi.
Buning uchun har bir holat guruhi uchun umumiy bekor qilish handlerini yozish tavsiya etiladi:
from aiogram import types
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
@dp.message(Command('cancel'))
async def cancel_handler(message: types.Message, state: FSMContext):
current_state = await state.get_state()
if current_state is None:
await message.answer("Bekor qilinadigan faol jarayon yo'q.")
return
await state.clear()
await message.answer("Amaliyot bekor qilindi.")state.clear() metodi nafaqat holatni (state), balki FSM xotirasida to'plangan vaqtinchalik ma'lumotlarni ham tozalaydi.
3. update_data() va get_data() Bilan Ehtiyotkor Bo'ling
Aiogram 3 da holat ma'lumotlarini saqlash uchun set_data() emas, balki update_data() metodidan foydalanish qat'iyan tavsiya etiladi. set_data() butun ma'lumotlar lug'atini (dict) yangisi bilan almashtirib yuboradi, bu esa avvalgi qadamlarda to'plangan qiymatlarning o'chib ketishiga sabab bo'lishi mumkin.
To'g'ri yondashuv quyidagicha:
@dp.message(Form.name)
async def process_name(message: types.Message, state: FSMContext):
await state.update_data(name=message.text)
await state.set_state(Form.age)
await message.answer("Yoshingizni kiriting:")Oxirgi qadamda barcha ma'lumotlarni olish va ma'lumotlar bazasiga yozish kerak bo'lganda quyidagi tartibda ishlanadi:
data = await state.get_data()
# Bazaga yozish logikasi: save_user(name=data['name'], age=data['age'])
await state.clear()4. Ma'lumotlarni Validatsiya Qiling va Foydalanuvchini Xabardor Qiling
FSM qadami foydalanuvchidan ma'lumot qabul qilganda, uni tekshirmasdan darhol keyingi bosqichga o'tkazmang. Masalan, bot yoshni yoki telefon raqamni so'raganda, foydalanuvchi matn yuborishi, rasm jo'natishi yoki noto'g'ri format kiritishi mumkin.
Agar kiritilgan qiymat noto'g'ri bo'lsa, holatni o'zgartirmang, faqat tushunarli xatolik xabarini yuboring:
@dp.message(Form.age)
async def process_age(message: types.Message, state: FSMContext):
if not message.text.isdigit():
await message.answer("Iltimos, yoshingizni faqat raqamlarda kiriting!")
return
age = int(message.text)
if age < 10 or age > 100:
await message.answer("Noto'g'ri yosh oralig'i kiritildi.")
return
await state.update_data(age=age)
await state.set_state(Form.phone)
await message.answer("Telefon raqamingizni yuboring:")Bunday yondashuv orqali foydalanuvchi joriy bosqichda qoladi va xatoni osonlikcha to'g'irlay oladi.
5. StatesGroup'larni Alohida Modullarga Ajrating
Loyihangiz kattalashib borgan sari o'nlab formalar va qadamlar paydo bo'ladi. Barcha StatesGroup sinflarini bitta faylda yoki botning asosiy ishga tushirish modulida saqlash arxitektura jihatidan xatodir. Har bir funksional modul (masalan, ro'yxatdan o'tish, buyurtma berish, fikr-mulohaza) uchun alohida holatlar faylini yarating.
# states/registration.py
from aiogram.fsm.state import State, StatesGroup
class RegistrationState(StatesGroup):
full_name = State()
phone_number = State()
confirm = State()Ushbu tartib kodning o'qilishini yaxshilaydi, bir nechta dasturchi bir loyihada ishlaganda ziddiyatlarni (merge conflicts) kamaytiradi va testlashni soddalashtiradi.
Xulosa
Aiogram 3 da FSM mexanizmi qulay va chaqqon ishlab chiqilgan. Redis'dan foydalanish, holatdan chiqish yo'lini qoldirish, ma'lumotlarni to'g'ri yangilash va validatsiyaga e'tibor berish orqali siz barqaror, foydalanuvchilar uchun qulay va buzilmaydigan Telegram botlarni yaratishingiz mumkin.
Teglar: #Aiogram 3 #Telegram Bot #Python #FSM #Best Practice