Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Blueprint (modullik)
- 2.2. url_prefix
- 2.3. Xato ishlovchilari
- 2.4. abort (xato ko'tarish)
- 2.5. So'rov hook'lari
- 2.6. Ilova konfiguratsiyasi
- 2.7. Kengaytmalar
- 2.8. Flask ilova tuzilishi
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Blueprint (modullik)
- Misol 2 — Xato ishlovchilari va abort
- Misol 3 — So'rov hook'lari
- Misol 4 — Amaliy: modulli Flask ilova
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
22.2-dars: Flask amaliyoti
22-QISM — BOSHQA FREYMVORKLAR · 2-dars
1. Kirish va motivatsiya
Flask asosini (marshrut, so'rov/javob) o'rgandik. Endi real ilova qurish uchun Flask'ning amaliy vositalarini o'rganamiz: Blueprint (modullik — kodni bo'laklarga ajratish), xato ishlovchilari (error handlers), so'rov hook'lari (before/after request) va kengaytmalar. Bular kichik loyihani kattaga o'stirish imkonini beradi.
Flask minimal, lekin o'sadigan (scalable): loyiha kattalashsa, Blueprint bilan app'larga bo'linadi (Django app'iga o'xshaydi), kengaytmalar bilan ORM/auth qo'shiladi. "Kichikdan boshlab, kerak bo'lsa o'stir" — Flask'ning kuchi.
Real vaziyat. Bir Flask loyihasi o'sdi — 50 endpoint bitta faylda, chalkash. Dasturchi Blueprint'ga o'tdi: kurslar, foydalanuvchilar, izohlar — har biri alohida modul (Blueprint). Yana xato ishlovchilari (404, 500 uchun izchil JSON) va so'rov log'i (before_request) qo'shdi. Kod tashkil bo'ldi, saqlanadigan bo'ldi. Flask kichikdan kattaga o'sdi — Blueprint bilan.
Bu darsda Flask amaliyotini — Blueprint, xato ishlovchilari va hook'larni o'rganamiz.
Bu darsda:
- Blueprint (modullik)
-
url_prefix(URL guruhlash) - Xato ishlovchilari (
errorhandler) abort(xato ko'tarish)- So'rov hook'lari (
before_request,after_request) - Ilova konfiguratsiyasi (
app.config) - Kengaytmalar (Flask-SQLAlchemy)
- Amaliy: modulli Flask ilova
ℹ Misollarda Flask
test_clientbilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. Blueprint (modullik)
Blueprint — Flask ilovasini modullarga ajratadi (Django app'iga o'xshaydi):
from flask import Blueprint
kurslar_bp = Blueprint("kurslar", __name__, url_prefix="/kurslar")
@kurslar_bp.route("/")
def royxat():
return "Kurslar"
# asosiy ilovaga ulash:
app.register_blueprint(kurslar_bp) Blueprint — marshrut, view, xato ishlovchilarini guruhlaydigan modul. Katta loyiha Blueprint'larga bo'linadi (kurslar, users). register_blueprint bilan asosiy ilovaga ulanadi. Bu 21.2 dagi Django app'iga o'xshaydi.
2.2. url_prefix
url_prefix — Blueprint URL'lariga prefiks:
kurslar_bp = Blueprint("kurslar", __name__, url_prefix="/kurslar")
@kurslar_bp.route("/") # → /kurslar/
@kurslar_bp.route("/<int:id>") # → /kurslar/5 url_prefix="/kurslar" — Blueprint'ning barcha marshrutlari shu prefiks bilan (/kurslar/, /kurslar/5). Bu URL'larni guruhlaydi (bir modul — bir prefiks). 21.2 dagi Django includega o'xshaydi.
2.3. Xato ishlovchilari
errorhandler — xato uchun izchil javob:
from flask import jsonify
@app.errorhandler(404)
def topilmadi(e):
return jsonify({"xato": "topilmadi"}), 404
@app.errorhandler(500)
def server_xato(e):
return jsonify({"xato": "server xatosi"}), 500 @app.errorhandler(kod) — xato holati uchun markazlashgan javob (20.12 FastAPI handler'iga o'xshaydi). Har 404 bir xil JSON qaytaradi (izchil). Bu xato javoblarini standartlashtiradi.
2.4. abort (xato ko'tarish)
abort — xato'ni ko'tarish (view ichida):
from flask import abort
@app.route("/kurslar/<int:kurs_id>")
def kurs(kurs_id):
if kurs_id not in BAZA:
abort(404) # 404 ko'taradi
return jsonify(BAZA[kurs_id]) abort(kod) — xato holatini darrov ko'taradi (FastAPI'dagi raise HTTPExceptionga o'xshaydi). errorhandler uni ushlab, izchil javob beradi. abort(404) + @errorhandler(404) — toza xato boshqaruvi.
2.5. So'rov hook'lari
before_request/after_request — har so'rovda ishlovchi:
@app.before_request
def oldin():
# har so'rovdan OLDIN (auth, log)
...
@app.after_request
def keyin(response):
# har javobdan KEYIN (sarlavha)
response.headers["X-Ishlangan"] = "ha"
return response before_request — har so'rov view'ga kirishdan oldin (auth tekshiruvi, log); after_request — har javob chiqishdan keyin (sarlavha qo'shish). Bu 21.15 dagi Django middleware'iga o'xshaydi (butun ilova darajasida).
2.6. Ilova konfiguratsiyasi
app.config — ilova sozlamalari:
app.config["DEBUG"] = False
app.config["SECRET_KEY"] = "..." # muhitdan
app.config["MAX_CONTENT_LENGTH"] = 16 * 1024 * 1024
# yoki fayldan:
app.config.from_object("config.Production") app.config — Flask sozlamalari (lug'at): SECRET_KEY, DEBUG, maxsus sozlamalar. Fayldan, muhitdan yoki to'g'ridan. Bu 21.2 dagi Django settingsga o'xshaydi (lekin oddiyroq).
2.7. Kengaytmalar
Flask kengaytmalari qo'shimcha imkoniyat beradi:
| Kengaytma | Vazifa |
|---|---|
| Flask-SQLAlchemy | ORM |
| Flask-Login | Autentifikatsiya |
| Flask-WTF | Forma |
| Flask-Migrate | Migratsiya |
| Flask-RESTful | REST API |
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)Kengaytmalar — Flask'ning minimalizmini to'ldiradi (ORM, auth). Faqat kerakni qo'shasiz (Django'da hammasi tayyor). Bu Flask'ning moslashuvchanligi — o'z to'plamingizni qurasiz.
2.8. Flask ilova tuzilishi
Katta Flask loyiha tuzilishi:
mysite/
app.py # ilova yaratish
config.py # sozlamalar
kurslar/ # Blueprint
__init__.py
routes.py
models.py
users/ # Blueprint
routes.py Katta Flask — Blueprint'lar (modullar), config, models. Bu 21.2 dagi Django tuzilishiga o'xshaydi (lekin siz qurasiz — Flask majbur qilmaydi). "Application factory" naqshi (create_app()) — katta loyihalar uchun.
3. Tez ma'lumotnoma
from flask import Flask, Blueprint, jsonify, abort, request
# Blueprint:
bp = Blueprint("kurslar", __name__, url_prefix="/kurslar")
@bp.route("/<int:kid>")
def bitta(kid):
if kid not in BAZA:
abort(404)
return jsonify(BAZA[kid])
# ilova:
app = Flask(__name__)
app.register_blueprint(bp)
# xato ishlovchi:
@app.errorhandler(404)
def topilmadi(e):
return jsonify({"xato": "topilmadi"}), 404
# hook:
@app.before_request
def oldin(): ...
@app.after_request
def keyin(response): return responseAmaliy vositalar
Blueprint — modul · url_prefix — guruh · errorhandler — xato javob
abort — xato ko'tarish · before/after_request — hook · app.config — sozlama4. Batafsil misollar
Misollarda Flask
test_clientbilan sinaladi.
Misol 1 — Blueprint (modullik)
"""Blueprint (modul); url_prefix (URL guruh); register_blueprint; ko'p modul."""
import warnings
warnings.filterwarnings("ignore")
from flask import Blueprint, Flask, jsonify
# kurslar Blueprint'i
kurslar_bp = Blueprint("kurslar", __name__, url_prefix="/kurslar")
@kurslar_bp.route("/")
def kurs_royxat():
return jsonify({"modul": "kurslar", "royxat": ["Python", "Go"]})
@kurslar_bp.route("/<int:kurs_id>")
def kurs_bitta(kurs_id):
return jsonify({"modul": "kurslar", "id": kurs_id})
# foydalanuvchilar Blueprint'i
users_bp = Blueprint("users", __name__, url_prefix="/users")
@users_bp.route("/profil")
def profil():
return jsonify({"modul": "users", "amal": "profil"})
app = Flask(__name__)
app.register_blueprint(kurslar_bp)
app.register_blueprint(users_bp)
def main() -> None:
client = app.test_client()
print("=== 1. kurslar Blueprint (url_prefix) ===")
print(f" /kurslar/ → {client.get('/kurslar/').get_json()}")
print("\n=== 2. kurslar bitta (prefiks + parametr) ===")
print(f" /kurslar/5 → {client.get('/kurslar/5').get_json()}")
print("\n=== 3. users Blueprint ===")
print(f" /users/profil → {client.get('/users/profil').get_json()}")
print("\n=== 4. Ikki modul, bir ilova ===")
print(" kurslar va users — alohida Blueprint (modul)")
print(" ⭐ Blueprint — modullik; url_prefix — URL guruh")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. kurslar Blueprint (url_prefix) ===
/kurslar/ → {'modul': 'kurslar', 'royxat': ['Python', 'Go']}
=== 2. kurslar bitta (prefiks + parametr) ===
/kurslar/5 → {'id': 5, 'modul': 'kurslar'}
=== 3. users Blueprint ===
/users/profil → {'amal': 'profil', 'modul': 'users'}
=== 4. Ikki modul, bir ilova ===
kurslar va users — alohida Blueprint (modul)
⭐ Blueprint — modullik; url_prefix — URL guruhNima ko'rsatdi: 2.1, 2.2-bo'limlar.
Misol 2 — Xato ishlovchilari va abort
"""errorhandler (izchil xato javob); abort (xato ko'tarish); 404, 400; markazlashgan xato."""
import warnings
warnings.filterwarnings("ignore")
from flask import Flask, abort, jsonify, request
app = Flask(__name__)
BAZA = {1: "Python", 2: "Go"}
@app.errorhandler(404)
def topilmadi(e):
return jsonify({"xato": "topilmadi", "kod": "YOQ"}), 404
@app.errorhandler(400)
def notogri_sorov(e):
return jsonify({"xato": "noto'g'ri so'rov", "kod": "XATO"}), 400
@app.route("/kurslar/<int:kurs_id>")
def kurs(kurs_id):
if kurs_id not in BAZA:
abort(404)
return jsonify({"id": kurs_id, "nom": BAZA[kurs_id]})
@app.route("/kurslar", methods=["POST"])
def yarat():
data = request.get_json()
if not data or "nom" not in data:
abort(400)
return jsonify({"yaratildi": data["nom"]}), 201
def main() -> None:
client = app.test_client()
print("=== 1. Muvaffaqiyatli ===")
print(f" /kurslar/1 → {client.get('/kurslar/1').get_json()}")
print("\n=== 2. ⚠️ abort(404) → errorhandler ===")
javob = client.get("/kurslar/999")
print(f" status {javob.status_code} → {javob.get_json()}")
print("\n=== 3. ⚠️ abort(400) → errorhandler ===")
javob = client.post("/kurslar", json={})
print(f" status {javob.status_code} → {javob.get_json()}")
print("\n=== 4. Izchil xato javob ===")
print(" har 404 → {'xato': 'topilmadi', 'kod': 'YOQ'}")
print(" ⭐ abort — xato ko'tarish; errorhandler — izchil javob")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Muvaffaqiyatli ===
/kurslar/1 → {'id': 1, 'nom': 'Python'}
=== 2. ⚠️ abort(404) → errorhandler ===
status 404 → {'kod': 'YOQ', 'xato': 'topilmadi'}
=== 3. ⚠️ abort(400) → errorhandler ===
status 400 → {'kod': 'XATO', 'xato': "noto'g'ri so'rov"}
=== 4. Izchil xato javob ===
har 404 → {'xato': 'topilmadi', 'kod': 'YOQ'}
⭐ abort — xato ko'tarish; errorhandler — izchil javobNima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — So'rov hook'lari
"""before_request (so'rovdan oldin); after_request (javobdan keyin); har so'rovga hook; log, sarlavha."""
import warnings
warnings.filterwarnings("ignore")
from flask import Flask, g, jsonify, request
app = Flask(__name__)
SO_ROVLAR = []
@app.before_request
def sorovni_logla():
SO_ROVLAR.append(request.path)
g.sorov_soni = len(SO_ROVLAR)
@app.after_request
def sarlavha_qosh(response):
response.headers["X-So-rov-Soni"] = str(len(SO_ROVLAR))
return response
@app.route("/kurslar")
def kurslar():
return jsonify({"kurslar": ["Python"], "sorov_soni": g.sorov_soni})
@app.route("/salom")
def salom():
return jsonify({"xabar": "salom"})
def main() -> None:
client = app.test_client()
print("=== 1. before_request (so'rov log) ===")
javob = client.get("/kurslar")
print(f" /kurslar → sorov_soni: {javob.get_json()['sorov_soni']}")
print("\n=== 2. after_request (sarlavha) ===")
print(f" X-So-rov-Soni: {javob.headers['X-So-rov-Soni']}")
print("\n=== 3. Har so'rov hook orqali ===")
client.get("/salom")
javob = client.get("/kurslar")
print(f" uchinchi so'rov soni: {javob.get_json()['sorov_soni']}")
print("\n=== 4. So'rovlar jurnali ===")
print(f" barcha so'rovlar: {SO_ROVLAR}")
print(" ⭐ before_request (oldin), after_request (keyin) — har so'rovda")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. before_request (so'rov log) ===
/kurslar → sorov_soni: 1
=== 2. after_request (sarlavha) ===
X-So-rov-Soni: 1
=== 3. Har so'rov hook orqali ===
uchinchi so'rov soni: 3
=== 4. So'rovlar jurnali ===
barcha so'rovlar: ['/kurslar', '/salom', '/kurslar']
⭐ before_request (oldin), after_request (keyin) — har so'rovdaNima ko'rsatdi: 2.5-bo'lim.
Misol 4 — Amaliy: modulli Flask ilova
Blueprint, xato ishlovchilari va hook'larni birlashtirgan to'liq modulli Flask ilova. Bu — real Flask loyihasining tuzilishi: modullar, markazlashgan xato, so'rov log'i.
"""to'liq modulli Flask: Blueprint (CRUD) + errorhandler + before/after_request; tashkil qilingan ilova."""
import warnings
warnings.filterwarnings("ignore")
from flask import Blueprint, Flask, abort, g, jsonify, request
# kurslar moduli (Blueprint)
kurslar_bp = Blueprint("kurslar", __name__, url_prefix="/kurslar")
KURSLAR = {1: {"nom": "Python", "narx": 100}}
KEYINGI = 2
@kurslar_bp.route("/", methods=["GET", "POST"])
def kurslar():
global KEYINGI
if request.method == "POST":
data = request.get_json()
if not data or "nom" not in data:
abort(400)
KURSLAR[KEYINGI] = {"nom": data["nom"], "narx": data.get("narx", 0)}
javob = {"id": KEYINGI, **KURSLAR[KEYINGI]}
KEYINGI += 1
return jsonify(javob), 201
return jsonify([{"id": k, **v} for k, v in KURSLAR.items()])
@kurslar_bp.route("/<int:kurs_id>")
def kurs(kurs_id):
if kurs_id not in KURSLAR:
abort(404)
return jsonify({"id": kurs_id, **KURSLAR[kurs_id]})
def create_app():
app = Flask(__name__)
app.config["SECRET_KEY"] = "namuna"
app.register_blueprint(kurslar_bp)
@app.errorhandler(404)
def topilmadi(e):
return jsonify({"xato": "topilmadi"}), 404
@app.errorhandler(400)
def notogri(e):
return jsonify({"xato": "noto'g'ri ma'lumot"}), 400
@app.after_request
def sarlavha(response):
response.headers["X-Ilova"] = "Wisar"
return response
return app
def main() -> None:
app = create_app()
client = app.test_client()
print("=== 1. Yaratish (Blueprint POST) ===")
javob = client.post("/kurslar/", json={"nom": "Go", "narx": 120})
print(f" status {javob.status_code} → {javob.get_json()}")
print("\n=== 2. Ro'yxat (Blueprint GET) ===")
print(f" kurslar: {[k['nom'] for k in client.get('/kurslar/').get_json()]}")
print("\n=== 3. Xato ishlovchilari ===")
print(f" /kurslar/999 → status {client.get('/kurslar/999').status_code}")
print(f" bo'sh POST → status {client.post('/kurslar/', json={}).status_code}")
print("\n=== 4. after_request sarlavha ===")
print(f" X-Ilova: {client.get('/kurslar/').headers['X-Ilova']}")
print(" ⭐ Blueprint + errorhandler + hook = modulli ilova")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Yaratish (Blueprint POST) ===
status 201 → {'id': 2, 'narx': 120, 'nom': 'Go'}
=== 2. Ro'yxat (Blueprint GET) ===
kurslar: ['Python', 'Go']
=== 3. Xato ishlovchilari ===
/kurslar/999 → status 404
bo'sh POST → status 400
=== 4. after_request sarlavha ===
X-Ilova: Wisar
⭐ Blueprint + errorhandler + hook = modulli ilovaNima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Hamma kod bitta faylda" | Blueprint (modul) |
| "Xatoni har view'da" | errorhandler (markaz) |
"abort — oddiy return" |
Xato ko'taradi |
| "Hook — bir view" | Har so'rov (before/after) |
| "Flask o'smaydi" | Blueprint bilan o'sadi |
| "Config kodda tarqoq" | app.config (markaz) |
| "Flask'da ORM yo'q" | Kengaytma (Flask-SQLAlchemy) |
"create_app keraksiz" |
Katta loyiha uchun (factory) |
6. Keng tarqalgan xatolar va yechimlari
1. Hamma kodni bitta faylda
# 50 endpoint app.py'da # ⚠️ chalkash
# ✅ Blueprint'lar (kurslar, users)2. register_blueprintni unutish
kurslar_bp = Blueprint(...) # ⚠️ ulanmagan
app.register_blueprint(kurslar_bp) # ✅3. Xatoni har view'da
if not found: return jsonify(...), 404 # ⚠️ takror
abort(404) + @app.errorhandler(404) # ✅4. after_requestda return unutish
@app.after_request
def keyin(response): response.headers[...] # ❌ return yo'q
return response # ✅5. SECRET_KEYni kodda
app.config["SECRET_KEY"] = "12345" # ⚠️ git'da
app.config["SECRET_KEY"] = os.environ[...] # ✅6. Blueprint URL'iga prefiks unutish
Blueprint("kurslar", __name__) # /royxat (chalkash)
Blueprint("kurslar", __name__, url_prefix="/kurslar") # ✅7. Global holatda poyga (production)
KURSLAR = {} # ⚠️ ko'p ishchi
# ✅ baza (Flask-SQLAlchemy)7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 22.1-dars (o'tilgan): Flask asoslari
- 21.2-dars (o'tilgan): Django app — Blueprint o'xshashi
- 20.12-dars (o'tilgan): xato boshqaruvi — errorhandler
- 21.15-dars (o'tilgan): middleware — hook o'xshashi
- 22.6-dars: shablon (Jinja2)
8. Eng yaxshi amaliyotlar
Katta loyihani Blueprint'larga bo'ling (modullik).
url_prefixbilan URL guruhlang.errorhandlerbilan izchil xato javob.abort+errorhandlerbilan toza xato boshqaruvi.before_request/after_requestbilan umumiy mantiq.app.configbilan sozlamalarni markazlashtiring.Kerak bo'lsa kengaytmalar (Flask-SQLAlchemy).
Katta loyihada
create_app(application factory).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # Blueprint nima?
2. # url_prefix nima?
3. # register_blueprint nima?
4. # errorhandler nima?
5. # abort nima?
6. # before_request nima?
7. # after_request nima?
8. # app.config nima?
9. # kengaytma nima?
10. # create_app nima?
11. # Blueprint Django'da nima?
12. # abort va errorhandler birga?Javoblar
- Ilovani modullarga ajratadigan bo'lak
- Blueprint URL'lariga prefiks
- Blueprint'ni ilovaga ulaydi
- Xato uchun izchil javob (markaz)
- Xato holatini ko'taradi
- Har so'rovdan oldin ishlovchi
- Har javobdan keyin ishlovchi
- Ilova sozlamalari (lug'at)
- Flask'ni to'ldiruvchi modul (ORM, auth)
- Application factory (ilova yaratish funksiyasi)
- App'iga o'xshaydi
abortko'taradi,errorhandlerushlab javob beradi
Vazifa 2: Xatolarni tuzating
1. # 50 endpoint bitta faylda # Blueprint
2. kurslar_bp = Blueprint(...) # register
3. if not found: return ..., 404 # abort/handler
4. @app.after_request
def keyin(response): response.headers... # return
5. Blueprint("kurslar", __name__) # url_prefixJavoblar
1. # Blueprint'lar (kurslar, users)
2. app.register_blueprint(kurslar_bp)
3. abort(404) + @app.errorhandler(404)
4. def keyin(response):
response.headers[...]
return response
5. Blueprint("kurslar", __name__, url_prefix="/kurslar")Vazifa 3: Modulli ilova
Blueprint bilan:
- Uch Blueprint (kurslar, users, izohlar)
- Har biri
url_prefix register_blueprinttest_clientbilan test
Vazifa 4: Xato tizimi
Xato ishlovchilari:
errorhandler(404, 400, 500)abortview'larda- Izchil JSON
- Har holatni test
Vazifa 5: So'rov hook'lari
before/after_request:
- So'rov log (before)
- Sarlavha (after)
gobyekti bilan ma'lumot- Test
Vazifa 6: Application factory
create_app:
- Factory funksiyasi
- Config, Blueprint, hook
- Ilova yaratish
- Test
Vazifa 7: O'ylash
Flask Blueprint kodni modullarga ajratadi (kurslar, users) — 21.2 dagi Django app, 19.1 dagi paket kabi. Bu "modullik" tamoyili har freymvorkda uchraydi (Django app, Flask Blueprint, FastAPI router). Turli freymvorklar bir xil muammoni (katta kodni tashkil qilish) turli nom bilan hal qilishi nima uchun muhim, va bu naqshlarni bilish yangi freymvork o'rganishni qanday osonlashtiradi?
Javob
Qisqa javob: Katta kodni tashkil qilish — universal muammo, va uni har freymvork bir xil g'oya (modullik) bilan hal qiladi, faqat turli nom: Django "app", Flask "Blueprint", FastAPI "router". Bu naqshlarni (modullik, marshrutlash, middleware/hook, ORM) bilish yangi freymvork o'rganishni osonlashtiradi, chunki siz g'oyani bilasiz — faqat yangi nom va sintaksisni o'rganasiz. "Bir muammo, bir g'oya, turli nom" — freymvorklar orasidagi umumiy naqsh. Bir freymvorkni chuqur bilgan odam boshqasini tez o'rganadi (naqshlar bir xil).
1. Bir muammo, turli nom
| Freymvork | Modullik | Marshrut | Hook |
|---|---|---|---|
| Django | App | urls.py | Middleware |
| Flask | Blueprint | @route | before_request |
| FastAPI | Router | @get | Depends/middleware |
2. Umumiy naqshlar
Har veb-freymvorkda: marshrutlash, so'rov/javob, modullik, middleware, shablon, ORM. G'oyalar bir xil — nom va sintaksis farq qiladi.
3. Naqshlarni bilish — tez o'rganish
Naqshni (modullik) bilgan odam yangi freymvorkda faqat nomni o'rganadi ("Flask'da bu Blueprint deyiladi"). G'oya tanish — o'rganish tez.
4. "Bir g'oya, turli shakl" boshqa joyda
| G'oya | Turli shakl |
|---|---|
| Modullik | App/Blueprint/Router |
| ORM | Django ORM/SQLAlchemy |
| Shablon | Jinja2/DTL |
| Validatsiya | Pydantic/serializer/forma |
5. Muhandislik saboqlari
- Freymvorklar bir muammoni bir g'oya bilan hal qiladi
- Naqshni bil (nom emas) — universal
- Bir freymvork chuqur → boshqasi tez
- G'oyani o'rgan, sintaksis keyin
6. Xulosa
- Modullik — universal (app/Blueprint/router)
- Bir muammo, bir g'oya, turli nom
- Naqshni bilish — yangi freymvork oson
- G'oyaga tayaning (nom emas)
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda Flask amaliyotini — modullik va real ilova qurishni o'rgandik.
Eng muhim uch fikr:
Blueprint — modullik. Blueprint — Flask ilovasini modullarga ajratadigan bo'lak (Django app'iga o'xshaydi): marshrut, view, xato ishlovchilarini guruhlaydi.
Blueprint(nom, __name__, url_prefix="/kurslar")bilan yaratiladi (barcha marshrutlari shu prefiks bilan),app.register_blueprint(bp)bilan asosiy ilovaga ulanadi. Katta loyiha Blueprint'larga bo'linadi (kurslar,users) — bu 21.2 dagi Django app'iga o'xshaydi.Xato boshqaruvi va hook'lar.
@app.errorhandler(kod)— xato holati uchun markazlashgan izchil javob (20.12 FastAPI handler'iga o'xshaydi);abort(kod)— view ichida xato'ni ko'taradi (raise HTTPExceptionga o'xshaydi). Ular birga toza xato boshqaruvi beradi.before_request(har so'rovdan oldin — auth, log) vaafter_request(har javobdan keyin — sarlavha) — so'rov hook'lari (21.15 Django middleware'iga o'xshaydi).Konfiguratsiya va o'sish.
app.config— ilova sozlamalari (lug'at:SECRET_KEY,DEBUG); kengaytmalar (Flask-SQLAlchemy, Flask-Login) minimalizmni to'ldiradi (faqat kerakni qo'shasiz). Katta loyihadacreate_app()(application factory) naqshi. Flask kichikdan kattaga o'sadi — Blueprint bilan. Turli freymvorklar (Django app, Flask Blueprint, FastAPI router) bir xil g'oyani (modullik) turli nom bilan hal qiladi — naqshni bilish yangi freymvork o'rganishni osonlashtiradi.
Keyingi darsda Litestar / Starlette ni o'rganamiz: zamonaviy, tezkor ASGI freymvorklari — async, tip belgilari va yuqori unumdorlik.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!