IlmHamroh
Python kursi/Boshqa freymvorklar2/6-dars14 daqiqa
Mundarija (22)

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_client bilan sinaladi.


2. Nazariya — chuqur tushuntirish

2.1. Blueprint (modullik)

Blueprint — Flask ilovasini modullarga ajratadi (Django app'iga o'xshaydi):

python
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:

python
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:

python
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):

python
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:

python
@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:

python
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
python
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

python
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 response

Amaliy vositalar

Blueprint — modul · url_prefix — guruh · errorhandler — xato javob
abort — xato ko'tarish · before/after_request — hook · app.config — sozlama

4. Batafsil misollar

Misollarda Flask test_client bilan sinaladi.

Misol 1 — Blueprint (modullik)

python
"""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:

text
=== 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 guruh

Nima ko'rsatdi: 2.1, 2.2-bo'limlar.

Misol 2 — Xato ishlovchilari va abort

python
"""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:

text
=== 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 javob

Nima ko'rsatdi: 2.3, 2.4-bo'limlar.

Misol 3 — So'rov hook'lari

python
"""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:

text
=== 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'rovda

Nima 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.

python
"""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:

text
=== 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 ilova

Nima 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

python
# 50 endpoint app.py'da                       # ⚠️ chalkash
# ✅ Blueprint'lar (kurslar, users)

2. register_blueprintni unutish

python
kurslar_bp = Blueprint(...)                   # ⚠️ ulanmagan
app.register_blueprint(kurslar_bp)            # ✅

3. Xatoni har view'da

python
if not found: return jsonify(...), 404        # ⚠️ takror
abort(404) + @app.errorhandler(404)           # ✅

4. after_requestda return unutish

python
@app.after_request
def keyin(response): response.headers[...]     # ❌ return yo'q
    return response                            # ✅

5. SECRET_KEYni kodda

python
app.config["SECRET_KEY"] = "12345"            # ⚠️ git'da
app.config["SECRET_KEY"] = os.environ[...]    # ✅

6. Blueprint URL'iga prefiks unutish

python
Blueprint("kurslar", __name__)                # /royxat (chalkash)
Blueprint("kurslar", __name__, url_prefix="/kurslar")   # ✅

7. Global holatda poyga (production)

python
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

  1. Katta loyihani Blueprint'larga bo'ling (modullik).

  2. url_prefix bilan URL guruhlang.

  3. errorhandler bilan izchil xato javob.

  4. abort + errorhandler bilan toza xato boshqaruvi.

  5. before_request/after_request bilan umumiy mantiq.

  6. app.config bilan sozlamalarni markazlashtiring.

  7. Kerak bo'lsa kengaytmalar (Flask-SQLAlchemy).

  8. Katta loyihada create_app (application factory).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. Ilovani modullarga ajratadigan bo'lak
  2. Blueprint URL'lariga prefiks
  3. Blueprint'ni ilovaga ulaydi
  4. Xato uchun izchil javob (markaz)
  5. Xato holatini ko'taradi
  6. Har so'rovdan oldin ishlovchi
  7. Har javobdan keyin ishlovchi
  8. Ilova sozlamalari (lug'at)
  9. Flask'ni to'ldiruvchi modul (ORM, auth)
  10. Application factory (ilova yaratish funksiyasi)
  11. App'iga o'xshaydi
  12. abort ko'taradi, errorhandler ushlab javob beradi

Vazifa 2: Xatolarni tuzating

python
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_prefix
Javoblar
python
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:

  1. Uch Blueprint (kurslar, users, izohlar)
  2. Har biri url_prefix
  3. register_blueprint
  4. test_client bilan test

Vazifa 4: Xato tizimi

Xato ishlovchilari:

  1. errorhandler (404, 400, 500)
  2. abort view'larda
  3. Izchil JSON
  4. Har holatni test

Vazifa 5: So'rov hook'lari

before/after_request:

  1. So'rov log (before)
  2. Sarlavha (after)
  3. g obyekti bilan ma'lumot
  4. Test

Vazifa 6: Application factory

create_app:

  1. Factory funksiyasi
  2. Config, Blueprint, hook
  3. Ilova yaratish
  4. 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

  1. Freymvorklar bir muammoni bir g'oya bilan hal qiladi
  2. Naqshni bil (nom emas) — universal
  3. Bir freymvork chuqur → boshqasi tez
  4. G'oyani o'rgan, sintaksis keyin

6. Xulosa

  1. Modullik — universal (app/Blueprint/router)
  2. Bir muammo, bir g'oya, turli nom
  3. Naqshni bilish — yangi freymvork oson
  4. 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:

  1. 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.

  2. 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) va after_request (har javobdan keyin — sarlavha) — so'rov hook'lari (21.15 Django middleware'iga o'xshaydi).

  3. 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 loyihada create_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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!