Dasturlash olamiga xush kelibsiz! 🌍
Salom, bo'lajak qahramon! Siz hozir internet qanday ishlashini sirini ochish arafasidasiz. Keling, murakkab atamalarni chetga surib, hayotiy misollarda gaplashamiz.
🍽️ 1. Mijoz va Server nima?
Tasavvur qiling, siz restorandasiz.
🤵 Mijoz (Client): Bu sizning brauzeringiz (Chrome, Safari, Telefoningiz). Siz ofitsiantga "Menga pitsa kerak" deb buyurtma berasiz.
👨🍳 Server: Bu orqa fondagi oshpaz. U sizning buyurtmangizni oladi, pitsani tayyorlaydi va sizga qaytarib beradi.
👉 Biz ushbu darslikda aynan o'sha Oshpazni (Serverni) yaratishni o'rganamiz!
🤔 2. Nima uchun aynan Flask?
Python tilida server yaratishning ko'plab usullari bor (Django, FastAPI va h.k).
Tasavvur qiling, sizga uy kerak:
🏰 Django: Sizga tayyor, mebellari bilan jihozlangan katta saroy beradi. Lekin uni o'zgartirish qiyin.
🧱 Flask: Sizga bo'sh, lekin juda mustahkam karkas bino beradi. Xonalarni, devor rangini, mebellarni o'zingiz xohlagancha tanlaysiz. U yengil, tez va o'rganish uchun eng zo'r tanlov!
🛠️ 3. O'rnatish (Qurilish asboblarini olish)
Ishni boshlashdan oldin kompyuteringizda Python o'rnatilgan bo'lishi kerak. Keyin qora ekranni (Terminal/CMD) ochib yozing:
pip install flask peewee
- pip — bu Python'ning "App Store"i. Dasturlarni tortib oladi.
- flask — Saytimizning asosiy dvigateli.
- peewee — Ma'lumotlarni xavfsiz saqlash omborchisi.
Salom Dunyo! 👋
Kompyuteringizda yangi papka oching va ichida app.py nomli fayl yarating. Barcha mo''jizalar shu fayl ichida yuz beradi.
1. Flaskni chaqirib olish
Birinchi navbatda biz o'rnatgan asbobimizni qutidan olamiz va saytimizga nom beramiz.
from flask import Flask
# Dasturimizni (serverni) yaratib olamiz. Unga "app" deb nom beramiz.
app = Flask(__name__)
Izoh: __name__ bu shunchaki Python'ning o'zini tanishtirish usuli. Flask bu orqali loyiha qayerdaligini bilib oladi.
2. Marshrutlar (Routes) nima?
Saytda har xil sahifalar bo'ladi: Bosh sahifa, Biz haqimizda, Kontaktlar. Marshrut bu "Qaysi manzilga kirsam nima chiqadi?" degan savolga javob beradi.
# "/" belgisi Bosh sahifa degani (masalan: google.com/)
@app.route('/')
def bosh_sahifa():
return "Salom Dunyo! Bu mening birinchi saytim! 🚀"
# "/biz-haqimizda" sahifasi
@app.route('/biz-haqimizda')
def about():
return "Biz haqimizda: Men bo'lajak zo'r dasturchiman! 😎"
@app.route() bu Dekorator deyiladi. Uni do'koningiz eshigidagi tepadagi yozuv (peshlavha) deb tasavvur qiling. Mijoz o'sha eshikdan kirsa, pastdagi funksiya (xizmatchi) uni kutib oladi.
3. Serverni yoqish (Start)
Kodlarimiz yozildi, endi uni butun dunyo ko'rishi uchun dvigatelni yoqishimiz kerak.
if __name__ == '__main__':
# Serverni 5000-chi portda ishga tushiramiz
# debug=True juda muhim! Xato qilsangiz qayerdaligini ko'rsatib beradi.
app.run(debug=True, port=5000)
Qanday ishlatamiz?
Kodni yozib bo'lgach, terminalda python app.py deb yozing. Keyin brauzeringizni ochib http://127.0.0.1:5000 manziliga kiring. Tabriklaymiz, siz o'z serveringizni yaratdingiz!
Dinamik URL'lar (Instagram siri) 🔗
Instagram'ga kirsangiz manzil instagram.com/cristiano yoki instagram.com/messi shaklida bo'ladi. Ular har bir inson uchun alohida 1 milliardta @app.route yozishmagan-ku?! Yo'q, ular Dinamik URL ishlatishadi.
1. Ismlarni ushlab olish (String)
Burchakli qavslar < > ichiga yozilgan so'z o'zgaruvchiga aylanadi. Flask uni ushlab, sizning funksiyangizga sovg'a qilib beradi.
# URL dan kelgan ismni orqali tutib olamiz
@app.route('/profil/')
def profil_korsat(ism):
# Funksiya endi o'sha ismni ishlatishi mumkin
return f"Siz hozir {ism.capitalize()} ning sahifasidasiz! 👤"
Natija: Siz hozir Alisher ning sahifasidasiz!
2. Raqamli o'zgaruvchilar (Integer)
Agar URL'ga faqat raqam yozishlarini xohlasangiz-chi? Masalan, yoshini yoki maqola ID sini ko'rsatish uchun. Bunda turini ham yozamiz: <int:nomi>
# Bu marshrut faqat raqam yozilsa ishlaydi
@app.route('/yosh/')
def yosh_hisobla(yosh):
tugilgan_yil = 2024 - yosh
return f"Siz taxminan {tugilgan_yil}-yilda tug'ilgansiz. 🎂"
Natija: Siz taxminan 2004-yilda tug'ilgansiz.
Agar siz `localhost:5000/yosh/olma` deb yozsangiz sayt ishlamaydi (404 xato beradi), chunki "olma" raqam emas! Bu ajoyib himoya tizimi.
Shablonlar (Jinja2) 🎨
Biz shu vaqtgacha ekranga faqat yalang'och qora matn chiqardik. Endi unga rang, rasm va dizayn (HTML/CSS) qo'shish vaqti keldi! Flask dizaynlarni ulash uchun Jinja2 degan dvigateldan foydalanadi.
1. Qoidalarni o'rnatamiz (Papkalar)
Flask barcha HTML dizaynlaringizni bitta joydan qidiradi. Kodlaringiz turgan joyda majburiy ravishda templates nomli papka ochishingiz kerak.
📄 app.py (Python kodimiz)
📁 templates/ (Shu papkani ochamiz)
📄 index.html (Dizaynimiz shu yerda bo'ladi)
2. HTML ga ma'lumot jo'natish (app.py)
Bizga qo'shimcha render_template asbobi kerak bo'ladi. U "Faylni o'qi va ekranga chiqartir" degani.
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def bosh_sahifa():
foydalanuvchi = "Behzod"
yoshi = 16
qiziqishlari = ["Futbol", "Dasturlash", "Kitob"]
# render_template fayl nomini va unga yuboriladigan ma'lumotlarni qabul qiladi
return render_template('index.html', ism=foydalanuvchi, yosh=yoshi, hobbi=qiziqishlari)
3. HTML ichida Python yozamiz (index.html)
Endi eng qiziq joyi! HTML fayl ichida maxsus qavslar yordamida Python o'zgaruvchilarini ishlata olamiz. Bu Jinja2 sintaksisi deyiladi.
<!DOCTYPE html>
<html>
<body>
<!-- 1-QOIDA: O'zgaruvchini ekranga chiqarish uchun {{ }} (ikki jingalak qavs) -->
<h1>Salom, {{ ism }}!</h1>
<!-- 2-QOIDA: Shart qo'yish uchun {% if %} {% else %} -->
{% if yosh >= 18 %}
<p>Siz saytga to'liq kira olasiz!</p>
{% else %}
<p>Ukam, hali yoshing yetmas ekan. (Hazil 😅)</p>
{% endif %}
<!-- 3-QOIDA: Takrorlash (Ro'yxatdagi elementlarni chiqarish) {% for %} -->
<h3>Sizning sevimli mashg'ulotlaringiz:</h3>
<ul>
{% for narsa in hobbi %}
<li>Men {{ narsa }} ni yaxshi ko'raman</li>
{% endfor %}
</ul>
</body>
</html>
Formalar (GET va POST siri) 📝
Saytga kirish bir narsa, lekin saytga nimadir YUBORISH tamoman boshqa narsa. Masalan, ro'yxatdan o'tish, rasm yuklash yoki izoh yozish. Vebda xat tashishning 2 ta usuli bor.
📖 1. GET (Ochiq Xat) vs 📮 POST (Yopiq Konvert)
GET So'rovi
GET xuddi ochiq otkritkaga o'xshaydi. Uni hamma o'qiy oladi. Ma'lumotlaringiz URL da ko'rinib qoladi (masalan: `google.com/?q=olma`). Parol yuborish uchun UYATLI va XAVFLI.
POST So'rovi
POST xuddi yelimlangan maxfiy konvert. Uni pochtachi ham o'qiy olmaydi. Ma'lumot URLda emas, so'rovning "tanasida" yashirinib boradi. Parollar faqat POST orqali yuboriladi!
2. HTML Formani to'g'ri yozish
Formadagi name atributiga yaxshilab qarang! Python serveringiz xatlarni aynan shu ismlarga qarab ajratib oladi.
<!-- action: xat qayerga boradi? method: qanday usulda? -->
<form action="/tizimga-kirish" method="POST">
<label>Login:</label>
<!-- name="foydalanuvchi_ismi" <-- Bu juda muhim! -->
<input type="text" name="foydalanuvchi_ismi">
<label>Parol:</label>
<!-- name="maxfiy_parol" -->
<input type="password" name="maxfiy_parol">
<button type="submit">Kirish</button>
</form>
3. Xatni Serverda kutib olish (app.py)
Xat HTML formadan chiqib ketdi. Endi uni Flask orqali tutib, tekshiramiz. Buning uchun bizga request asbobi kerak.
from flask import Flask, render_template, request
app = Flask(__name__)
# Bu eshikka ham GET bilan ko'rishga kelishlari,
# ham POST bilan ma'lumot tashlab ketishlari mumkin!
@app.route('/tizimga-kirish', methods=['GET', 'POST'])
def login():
# 1. Agar odam tugmani bosib, POST orqali kelsa:
if request.method == 'POST':
# formadagi name atributlarini ushlab olamiz
k_login = request.form.get('foydalanuvchi_ismi')
k_parol = request.form.get('maxfiy_parol')
# Parolni tekshiramiz
if k_login == 'admin' and k_parol == '12345':
return "Tizimga muvaffaqiyatli kirdingiz! 🎉"
else:
return "Login yoki parol xato! ❌"
# 2. Agar odam birinchi marta sahifani ochayotgan bo'lsa (GET):
# Unga formasi bor sahifani ko'rsatamiz
return render_template('login_formasi.html')
Baza (Omborxona) sirlari 🗄️
Saytni o'chirsangiz formadagi yozuvlar yo'qoladi. Chunki ular vaqtinchalik xotirada edi. Bizga umrbod saqlanadigan Omborxona (Ma'lumotlar bazasi) kerak.
1. SQLite va Peewee (Tarjimon)
Ma'lumotlar bazasi SQL deb nomlangan o'zining qiyin tili (Chet tili)ga ega. Uni noldan o'rganish vaqt oladi.
Yaxshiyamki, Peewee degan ajoyib tarjimon (ORM) bor. Biz unga odatiy Python tilida gapiramiz, u esa so'zlarimizni bazaga tushuntirib beradi!
2. Baza va Jadval yaratish (app.py)
Omborxona quramiz va u yerga daftar (Jadval) qo'yamiz.
from flask import Flask, render_template, request, redirect
from peewee import *
app = Flask(__name__)
# 1. Baza faylini yaratish (U avtomatik sizning papkangizda paydo bo'ladi)
db = SqliteDatabase('mening_blogim.db')
# 2. Daftar (Jadval) yaratamiz. Uni 'Model' deb atashadi.
class Maqola(Model):
sarlavha = CharField() # Qisqa matnlar uchun (Ism, Sarlavha)
matn = TextField() # Uzun cheksiz matnlar uchun (Maqola o'zi)
class Meta:
database = db # Bu jadval qaysi bazaga tegishliligini aytamiz
# 3. Dastur yonganda jadvallar yaratilishini ta'minlaymiz
db.connect()
db.create_tables([Maqola])
⚙️ To'liq CRUD Amallari
Har qanday sayt (Instagram, Tiktok) faqat 4 ta narsa qila oladi: Create (yaratish), Read (o'qish), Update (tahrirlash), Delete (o'chirish).
# --- [R] READ (O'QISH) ---
@app.route('/')
def bosh_sahifa():
# Bazadagi barcha maqolalarni tortib olamiz
barcha_maqolalar = Maqola.select()
return render_template('index.html', postlar=barcha_maqolalar)
# --- [C] CREATE (YANGI QO'SHISH) ---
@app.route('/yozish', methods=['GET', 'POST'])
def yangi():
if request.method == 'POST':
# Formadan kelgan yozuvlarni ushlab olamiz
kelgan_sarlavha = request.form.get('sarlavha_inputi')
kelgan_matn = request.form.get('matn_inputi')
# BAZAGA SAQLAYMIZ! (.create asbobi orqali)
Maqola.create(sarlavha=kelgan_sarlavha, matn=kelgan_matn)
# Ish tugagach, qayta bosh sahifaga jo'natib yuboramiz
return redirect('/')
return render_template('yangi.html')
# --- [U] UPDATE (TAHRIRLASH) ---
# Qaysi maqolani tahrirlashni ID orqali bilamiz
@app.route('/tahrirlash/', methods=['GET', 'POST'])
def tahrirla(id):
# Avval o'sha ID ga teng maqolani bazadan topamiz
topilgan_maqola = Maqola.get(Maqola.id == id)
if request.method == 'POST':
# Yangi kelgan xabarlarga almashtiramiz
topilgan_maqola.sarlavha = request.form.get('yangi_sarlavha')
topilgan_maqola.matn = request.form.get('yangi_matn')
topilgan_maqola.save() # .save() o'zgarishlarni saqlaydi!
return redirect('/')
return render_template('tahrirlash.html', maqola=topilgan_maqola)
# --- [D] DELETE (O'CHIRISH) ---
@app.route('/ochirish/')
def ochirish(id):
topilgan_maqola = Maqola.get(Maqola.id == id)
topilgan_maqola.delete_instance() # O'chirish funksiyasi
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)
Hamma O'rganganlarimiz 1 Joyda! 🛠️
Quyida VS Code ga o'xshash haqiqiy muharrir (Editor). Men sizga tayyor skelet yozib qo'ydim. Uni ko'zdan kechiring, tahrirlang. Ishga tushirish uchun nusxalab kompyuteringizdagi app.py fayliga tashlang.
Tabriklaymiz, Qahramon!
Siz eng qiyin bosqichlarni – Flask freymvorkini, marshrutlarni, Jinja shablonlarni va Peewee (SQLite) ma'lumotlar bazasini boshqarishni a'lo darajada o'rgandingiz.
Endi o'zingizning mustaqil "Tiktok" yoki "Blog"ingizni yarata olasiz! Olg'a! 🚀