IlmHamroh
Python kursi/Django2/16-dars15 daqiqa
Mundarija (22)

21.2-dars: Loyiha va ilova

21-QISM — DJANGO · 2-dars


1. Kirish va motivatsiya

Django falsafasini tushundik. Endi amaliy boshlaymiz: Django loyihasi qanday tuziladi? Django ikki darajali tuzilma ishlatadi — project (butun sayt) va app (bir modul). Buni to'g'ri tushunish — Django ilova qurishning asosi.

Django buyruqlar (django-admin startproject, startapp) tayyor tuzilma yaratadi. settings.py — loyiha miyasi (baza, app'lar, sozlamalar). URL'lar so'rovlarni view'larga yo'naltiradi — project darajasida va app darajasida. Bu tuzilmani bilish — har Django ishining boshlanishi.

Real vaziyat. Bir yangi Django dasturchi barcha kodni bitta views.pyga yozdi — modellar, view'lar, hammasi aralash, 2000 qatorli fayl. Loyiha o'sgan sari boshqarish imkonsiz bo'ldi. Tajribali dasturchi kodni app'larga ajratdi: kurslar, foydalanuvchilar, izohlar — har biri o'z model, view, URL bilan. Endi har qism mustaqil, tushunarli, qayta ishlatiladigan. Django'ning project/app tuzilmasi kodni tashkil qiladi.

Bu darsda loyiha va ilova tuzilmasini — project, app, settings va URL yo'naltirishini o'rganamiz.

Bu darsda:

  • Project va app farqi
  • Loyiha tuzilmasi (fayllar)
  • settings.py — sozlamalar
  • INSTALLED_APPS — app'larni ro'yxatdan o'tkazish
  • URL yo'naltirish (project + app)
  • include bilan app URL'lari
  • startproject/startapp buyruqlari
  • Amaliy: ko'p app'li loyiha

ℹ Misollarda Django standalone sozlanadi — odatda django-admin buyruqlari tuzilmani yaratadi.


2. Nazariya — chuqur tushuntirish

2.1. Project va app

Django ikki darajali tuzilmaga ega:

Daraja Nima Misol
Project Butun sayt (bir dona) mysite/
App Bir vazifali modul (ko'p) kurslar/, users/

Project — butun loyiha (sozlamalar, umumiy URL, ma'lumot bazasi). App — bir vazifaga mas'ul modul (kurslar, foydalanuvchilar). Bir project ko'p app'dan iborat; bir app boshqa loyihada ham ishlatiladi (qayta ishlatiladigan).

2.2. Loyiha tuzilmasi

django-admin startproject mysite yaratadi:

mysite/                  # tashqi papka
    manage.py            # boshqaruv buyruqlari
    mysite/              # project paketi
        __init__.py
        settings.py      # sozlamalar
        urls.py          # asosiy URL'lar
        wsgi.py / asgi.py # server kirish nuqtasi

python manage.py startapp kurslar yaratadi:

kurslar/                 # app
    models.py            # modellar
    views.py             # view'lar
    admin.py             # admin sozlamalari
    apps.py              # app konfiguratsiyasi
    migrations/          # baza migratsiyalari

manage.py — loyiha boshqaruvi (runserver, migrate, startapp). Har fayl kelishuvli nom bilan (Django uni topadi).

2.3. settings.py — sozlamalar

settings.py — loyiha markaziy sozlamalari:

python
DEBUG = True                     # ishlab chiqarishda False!
INSTALLED_APPS = [...]           # faol app'lar
DATABASES = {...}                # baza ulanishi
SECRET_KEY = "..."               # maxfiy kalit (.env'da!)
ALLOWED_HOSTS = [...]            # ruxsat berilgan hostlar

settings.py — loyiha miyasi: baza, app'lar, xavfsizlik, til, vaqt zonasi. DEBUG=True — rivojlanishda (batafsil xato); ishlab chiqarishda False (xavfsizlik). SECRET_KEY — .envda saqlanadi.

2.4. INSTALLED_APPS

INSTALLED_APPS — loyihadagi faol app'lar:

python
INSTALLED_APPS = [
    "django.contrib.admin",       # admin panel
    "django.contrib.auth",        # autentifikatsiya
    "django.contrib.contenttypes",
    "kurslar",                    # sizning app'ingiz
    "foydalanuvchilar",
]

App INSTALLED_APPSga qo'shilsa — Django uni taniydi (modellari, migratsiyalari, admin). Django o'z app'lari (admin, auth) tayyor keladi. O'z app'ingizni qo'shsangiz, u faollashadi.

2.5. URL yo'naltirish

URL'lar so'rovni view'ga yo'naltiradi:

python
# project urls.py (asosiy)
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("kurslar/", include("kurslar.urls")),    # app'ga yo'naltiradi
]

Project urls.py — asosiy yo'naltirgich; include bilan app URL'lariga topshiradi (/kurslar/... → kurslar/urls.py). Bu URL'larni app'lar bo'yicha tashkil qiladi.

2.6. include bilan app URL'lari

Har app o'z urls.pysiga ega:

python
# kurslar/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("", views.royxat),               # /kurslar/
    path("<int:pk>/", views.bitta),        # /kurslar/5/
]

App URL'lari app ichida (mustaqil). Project include("kurslar.urls") bilan ularni ulaydi. Bu modullik — app URL'lari app bilan birga (qayta ishlatiladigan).

2.7. startproject va startapp

Django buyruqlar bilan tuzilma yaratadi:

Buyruq Vazifa
django-admin startproject mysite Yangi project
python manage.py startapp kurslar Yangi app
python manage.py runserver Server ishga tushirish
python manage.py migrate Baza migratsiyasi

Bu buyruqlar tayyor tuzilma (fayllar, papkalar) yaratadi — noldan yozish shart emas. "Batareyalar ichida" 21.1-bob — hatto loyiha tuzilmasi tayyor.

2.8. Modullik (app qayta ishlatish)

App — mustaqil, qayta ishlatiladigan modul:

Xususiyat Foyda
Mustaqil O'z model, view, URL
Qayta ishlatish Boshqa loyihada
Tashkil Kod app'lar bo'yicha
Jamoa Har app — har dasturchi

App'lar kodni modullaydi: har app bir vazifa (kurslar, to'lov, xabar). Yaxshi loyiha — ko'p kichik, mustaqil app. Bu tashkil, qayta ishlatish va jamoa ishini osonlashtiradi.


3. Tez ma'lumotnoma

python
# Loyiha yaratish (buyruqlar):
django-admin startproject mysite
python manage.py startapp kurslar
python manage.py runserver

# settings.py:
INSTALLED_APPS = ["django.contrib.admin", ..., "kurslar"]
DATABASES = {"default": {...}}
DEBUG = True    # ishlab chiqarishda False

# project urls.py:
urlpatterns = [path("kurslar/", include("kurslar.urls"))]

# kurslar/urls.py:
urlpatterns = [path("", views.royxat), path("<int:pk>/", views.bitta)]

Tuzilma

project (butun sayt) ⊃ app (bir modul) ⊃ model/view/url

4. Batafsil misollar

Misollarda Django standalone sozlanadi (odatda django-admin yaratadi).

Misol 1 — Sozlamalar (settings)

python
"""settings.py sozlamalari; INSTALLED_APPS; DATABASES; DEBUG; sozlamalarga kirish."""

import warnings
warnings.filterwarnings("ignore")

import sys
import tempfile
import types

import django
from django.conf import settings

# settings.configure — odatda settings.py fayli
settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=[
        "django.contrib.contenttypes",
        "django.contrib.auth",
        "kurslar",
        "foydalanuvchilar",
    ],
    LANGUAGE_CODE="uz",
    TIME_ZONE="Asia/Tashkent",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
for nom in ("kurslar", "foydalanuvchilar"):
    m = types.ModuleType(nom)
    m.__path__ = [tempfile.gettempdir()]
    sys.modules[nom] = m
django.setup()


def main() -> None:
    print("=== 1. Asosiy sozlamalar ===")
    print(f"  DEBUG: {settings.DEBUG}")
    print(f"  til: {settings.LANGUAGE_CODE}, vaqt zonasi: {settings.TIME_ZONE}")

    print("\n=== 2. Baza sozlamasi ===")
    print(f"  ENGINE: {settings.DATABASES['default']['ENGINE'].split('.')[-1]}")

    print("\n=== 3. INSTALLED_APPS ===")
    print(f"  jami app: {len(settings.INSTALLED_APPS)}")
    print(f"  o'z app'lar: {[a for a in settings.INSTALLED_APPS if not a.startswith('django')]}")

    print("\n=== 4. Django o'z app'lari ===")
    print(f"  django app'lar: {[a.split('.')[-1] for a in settings.INSTALLED_APPS if a.startswith('django')]}")
    print("  ⭐ settings.py — loyiha markazi (baza, app'lar, til, xavfsizlik)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Asosiy sozlamalar ===
  DEBUG: False
  til: uz, vaqt zonasi: Asia/Tashkent

=== 2. Baza sozlamasi ===
  ENGINE: sqlite3

=== 3. INSTALLED_APPS ===
  jami app: 4
  o'z app'lar: ['kurslar', 'foydalanuvchilar']

=== 4. Django o'z app'lari ===
  django app'lar: ['contenttypes', 'auth']
  ⭐ settings.py — loyiha markazi (baza, app'lar, til, xavfsizlik)

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

Misol 2 — Ko'p app'li URL yo'naltirish

python
"""project + app URL yo'naltirish; include bilan app URL'lari; bir necha app; modullik."""

import warnings
warnings.filterwarnings("ignore")

import sys
import tempfile
import types

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["wisar"],
    ROOT_URLCONF=__name__,
    ALLOWED_HOSTS=["*"],
    SECRET_KEY="namuna-kalit",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()

from django.http import JsonResponse
from django.urls import include, path


# kurslar app view'lari
def kurs_royxat(request):
    return JsonResponse({"app": "kurslar", "amal": "ro'yxat"})


def kurs_bitta(request, pk):
    return JsonResponse({"app": "kurslar", "id": pk})


kurslar_urls = [
    path("", kurs_royxat),
    path("<int:pk>/", kurs_bitta),
]


# foydalanuvchilar app view'lari
def user_profil(request):
    return JsonResponse({"app": "foydalanuvchilar", "amal": "profil"})


users_urls = [path("profil/", user_profil)]


# project asosiy URL'lari — include bilan app'larga topshiradi
urlpatterns = [
    path("kurslar/", include(kurslar_urls)),
    path("users/", include(users_urls)),
]


def main() -> None:
    from django.test import Client
    client = Client()

    print("=== 1. kurslar app (ro'yxat) ===")
    print(f"  /kurslar/ → {client.get('/kurslar/').json()}")

    print("\n=== 2. kurslar app (bitta, URL parametri) ===")
    print(f"  /kurslar/5/ → {client.get('/kurslar/5/').json()}")

    print("\n=== 3. foydalanuvchilar app ===")
    print(f"  /users/profil/ → {client.get('/users/profil/').json()}")

    print("\n=== 4. Yo'q sahifa (404) ===")
    print(f"  /yoq/ → status {client.get('/yoq/').status_code}")
    print("  ⭐ project URL → include → app URL (modullik)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. kurslar app (ro'yxat) ===
  /kurslar/ → {'app': 'kurslar', 'amal': "ro'yxat"}

=== 2. kurslar app (bitta, URL parametri) ===
  /kurslar/5/ → {'app': 'kurslar', 'id': 5}

=== 3. foydalanuvchilar app ===
  /users/profil/ → {'app': 'foydalanuvchilar', 'amal': 'profil'}

=== 4. Yo'q sahifa (404) ===
  /yoq/ → status 404
  ⭐ project URL → include → app URL (modullik)

Nima ko'rsatdi: 2.5, 2.6-bo'limlar.

Misol 3 — App konfiguratsiyasi va ro'yxatdan o'tish

python
"""app'ni INSTALLED_APPS'ga qo'shish; app modellari topiladi; app registri; app labellari."""

import warnings
warnings.filterwarnings("ignore")

import sys
import tempfile
import types

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["django.contrib.contenttypes", "django.contrib.auth", "kurslar"],
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("kurslar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["kurslar"] = _app
django.setup()

from django.apps import apps
from django.db import models


class Kurs(models.Model):
    nom = models.CharField(max_length=100)

    class Meta:
        app_label = "kurslar"


class Dars(models.Model):
    sarlavha = models.CharField(max_length=200)

    class Meta:
        app_label = "kurslar"


def main() -> None:
    print("=== 1. Ro'yxatdan o'tgan app'lar ===")
    app_nomlari = [a.label for a in apps.get_app_configs()]
    print(f"  app'lar: {app_nomlari}")

    print("\n=== 2. App modellarini topish ===")
    kurslar_app = apps.get_app_config("kurslar")
    modellar = [m.__name__ for m in kurslar_app.get_models()]
    print(f"  kurslar app modellari: {sorted(modellar)}")

    print("\n=== 3. Model app'ga tegishli ===")
    print(f"  Kurs app label: {Kurs._meta.app_label}")
    print(f"  Kurs jadval nomi: {Kurs._meta.db_table}")

    print("\n=== 4. Django auth modellari ===")
    auth_models = [m.__name__ for m in apps.get_app_config("auth").get_models()]
    print(f"  auth app modellari (tayyor): {sorted(auth_models)[:4]}")
    print("  ⭐ INSTALLED_APPS — app modellari topiladi (registri)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Ro'yxatdan o'tgan app'lar ===
  app'lar: ['contenttypes', 'auth', 'kurslar']

=== 2. App modellarini topish ===
  kurslar app modellari: ['Dars', 'Kurs']

=== 3. Model app'ga tegishli ===
  Kurs app label: kurslar
  Kurs jadval nomi: kurslar_kurs

=== 4. Django auth modellari ===
  auth app modellari (tayyor): ['Group', 'Permission', 'User']
  ⭐ INSTALLED_APPS — app modellari topiladi (registri)

Nima ko'rsatdi: 2.1, 2.4, 2.8-bo'limlar.

Misol 4 — Amaliy: ko'p app'li loyiha

Real loyiha bir necha app'dan iborat — har biri o'z model, view, URL bilan. Kurslar platformasini ikki app (kurslar va izohlar) bilan quramiz, har biri o'z URL'iga ega.

python
"""ko'p app loyiha: kurslar va izohlar app'lari; har biri model + view + URL; include bilan birlashtirish."""

import warnings
warnings.filterwarnings("ignore")

import sys
import tempfile
import types

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["wisar"],
    ROOT_URLCONF=__name__,
    ALLOWED_HOSTS=["*"],
    SECRET_KEY="namuna",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()

from django.db import connection, models
from django.http import JsonResponse
from django.urls import include, path


# kurslar app modeli
class Kurs(models.Model):
    nom = models.CharField(max_length=100)
    narx = models.IntegerField()

    class Meta:
        app_label = "wisar"


# izohlar app modeli
class Izoh(models.Model):
    kurs_nomi = models.CharField(max_length=100)
    matn = models.CharField(max_length=500)

    class Meta:
        app_label = "wisar"


# kurslar app view'lari
def kurs_royxat(request):
    kurslar = list(Kurs.objects.values("id", "nom", "narx"))
    return JsonResponse({"kurslar": kurslar})


# izohlar app view'lari
def izoh_royxat(request):
    izohlar = list(Izoh.objects.values("kurs_nomi", "matn"))
    return JsonResponse({"izohlar": izohlar})


urlpatterns = [
    path("kurslar/", include([path("", kurs_royxat)])),
    path("izohlar/", include([path("", izoh_royxat)])),
]


def main() -> None:
    with connection.schema_editor() as se:
        se.create_model(Kurs)
        se.create_model(Izoh)

    Kurs.objects.create(nom="Python", narx=100)
    Kurs.objects.create(nom="Go", narx=120)
    Izoh.objects.create(kurs_nomi="Python", matn="zo'r dars")

    from django.test import Client
    client = Client()

    print("=== 1. kurslar app ===")
    javob = client.get("/kurslar/").json()
    print(f"  kurslar soni: {len(javob['kurslar'])}")
    print(f"  nomlar: {[k['nom'] for k in javob['kurslar']]}")

    print("\n=== 2. izohlar app ===")
    javob = client.get("/izohlar/").json()
    print(f"  izohlar: {javob['izohlar']}")

    print("\n=== 3. Har app mustaqil ===")
    print("  kurslar → kurslar modeli/view; izohlar → izohlar modeli/view")

    print("\n=== 4. Bir loyiha, ko'p app ===")
    print(f"  /kurslar/ va /izohlar/ — bir project, alohida app")
    print("  ⭐ ko'p app — modullik (har biri model+view+URL)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. kurslar app ===
  kurslar soni: 2
  nomlar: ['Python', 'Go']

=== 2. izohlar app ===
  izohlar: [{'kurs_nomi': 'Python', 'matn': "zo'r dars"}]

=== 3. Har app mustaqil ===
  kurslar → kurslar modeli/view; izohlar → izohlar modeli/view

=== 4. Bir loyiha, ko'p app ===
  /kurslar/ va /izohlar/ — bir project, alohida app
  ⭐ ko'p app — modullik (har biri model+view+URL)

Nima ko'rsatdi: 2.1, 2.5, 2.6, 2.8-bo'limlar.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Project = app" Project ⊃ app (ko'p)
"Hamma kod bitta faylda" App'larga ajratish
"settings.py keraksiz" Loyiha markazi
"App avtomatik faol" INSTALLED_APPSga qo'shish
"URL faqat project'da" App'da ham (include)
"DEBUG=True ishlab chiqarishda" False (xavfsizlik)
"App qayta ishlatilmaydi" Mustaqil (boshqa loyihada)
"Bir app yetarli" Ko'p kichik app yaxshiroq

6. Keng tarqalgan xatolar va yechimlari

1. App'ni INSTALLED_APPSga qo'shmaslik

python
INSTALLED_APPS = [...]                       # ⚠️ kurslar yo'q
INSTALLED_APPS = [..., "kurslar"]            # ✅

2. Hamma kodni bitta app/faylda

python
# 2000 qatorli views.py                       # ⚠️
# kurslar/, users/, izohlar/ — alohida app    # ✅

3. DEBUG=True ishlab chiqarishda

python
DEBUG = True                                 # ⚠️ xavfli (xato oshkor)
DEBUG = False                                # ✅ ishlab chiqarishda

4. include o'rniga to'g'ridan URL

python
# project urls'da barcha app URL'lari         # ⚠️ aralash
path("kurslar/", include("kurslar.urls"))     # ✅

5. SECRET_KEYni kodda

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

6. Project va app nomini bir xil qilish

python
# project=kurslar, app=kurslar                # ⚠️ chalkash
# project=mysite, app=kurslar                 # ✅

7. App URL'larini project'da aralashtirish

python
# barcha view project urls'da                 # ⚠️
# app URL'lari app/urls.py'da                  # ✅ modullik

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 21.1-dars (o'tilgan): Django falsafasi, MTV
  • 21.3-dars: model — app modellari
  • 21.6-dars: view va URL — chuqurroq
  • 19.1-dars (o'tilgan): loyiha tuzilishi (paket)
  • 21.16-dars: deploy — settings ishlab chiqarish uchun

8. Eng yaxshi amaliyotlar

  1. Kodni app'larga bo'ling (har biri bir vazifa).

  2. App'ni INSTALLED_APPSga qo'shing.

  3. App URL'larini include bilan ulang (modullik).

  4. SECRET_KEYni .envda saqlang.

  5. DEBUG=False ishlab chiqarishda.

  6. Project va app nomlarini farqlang.

  7. Kichik, mustaqil app'lar yozing (qayta ishlatiladigan).

  8. Kelishuvli fayl nomlarini saqlang (models.py, views.py, urls.py).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # project va app farqi?
2.  # settings.py nima?
3.  # INSTALLED_APPS nima?
4.  # startproject nima yaratadi?
5.  # startapp nima yaratadi?
6.  # include nima qiladi?
7.  # DEBUG ishlab chiqarishda?
8.  # SECRET_KEY qayerda?
9.  # manage.py nima uchun?
10. # bir project necha app?
11. # app URL'lari qayerda?
12. # app qayta ishlatiladimi?
Javoblar
  1. Project — butun sayt, app — bir modul (project ⊃ app)
  2. Loyiha markaziy sozlamalari
  3. Loyihadagi faol app'lar ro'yxati
  4. Project tuzilmasi (settings, urls, manage.py)
  5. App tuzilmasi (models, views, urls)
  6. App URL'larini project'ga ulaydi
  7. False (xavfsizlik)
  8. .envda (git'da emas)
  9. Loyiha boshqaruvi (runserver, migrate)
  10. Ko'p (cheklovsiz)
  11. App ichida (app/urls.py)
  12. Ha (mustaqil, boshqa loyihada)

Vazifa 2: Xatolarni tuzating

python
1.  INSTALLED_APPS = [...]           # kurslar yo'q

2.  DEBUG = True                     # ishlab chiqarishda

3.  SECRET_KEY = "12345"             # kodda

4.  # barcha URL project urls'da     # aralash

5.  # 2000 qatorli bitta views.py    # app
Javoblar
python
1.  INSTALLED_APPS = [..., "kurslar"]

2.  DEBUG = False

3.  SECRET_KEY = os.environ["SECRET_KEY"]

4.  path("kurslar/", include("kurslar.urls"))

5.  # kurslar/, users/ — alohida app'lar

Vazifa 3: Loyiha rejalash

Blog loyihasi tuzilmasi:

  1. Project nomi va app'lar (blog, users, izoh)
  2. Har app — model, view, URL
  3. INSTALLED_APPS ro'yxati
  4. URL yo'naltirish (include)

Vazifa 4: Sozlamalar

settings bilan ishlash (standalone):

  1. DATABASES, INSTALLED_APPS, DEBUG
  2. Til va vaqt zonasi
  3. Sozlamalarga kirish va chiqarish
  4. Django app'lari vs o'z app'lar

Vazifa 5: Ko'p app URL

Uch app'li URL tizimi:

  1. kurslar, users, izohlar app'lari
  2. Har biri o'z URL'iga (include)
  3. Client bilan har birini test
  4. 404 holatini test

Vazifa 6: App registri

App va model registri:

  1. apps.get_app_configs() bilan app'lar
  2. Har app modellari
  3. Model app label va jadval nomi
  4. Django auth modellari

Vazifa 7: O'ylash

Django project/app tuzilmasi kodni modullaydi: har app bir vazifaga (kurslar, to'lov, xabar) mas'ul, mustaqil, qayta ishlatiladigan. Bu 19.1 dagi paket tuzilishi va umuman "modullik" (modularity) tamoyilining Django'dagi ko'rinishi. Kodni kichik, mustaqil modullarga ajratishning afzalligi nima, va "bir vazifa, bir modul" tamoyili katta tizimlarni qanday boshqariladigan qiladi?

Javob

Qisqa javob: Modullik — katta tizimni kichik, mustaqil qismlarga (app, paket, modul) ajratish. Har modul bir vazifaga mas'ul (kurslar, to'lov) va boshqalardan mustaqil. Afzalligi: tushunarlilik (kichik qismni tushunish oson), mustaqil ishlash (bir modulni o'zgartirish boshqasini buzmaydi), qayta ishlatish (modul boshqa joyda), jamoa ishi (har dasturchi o'z moduli). "Bir vazifa, bir modul" katta tizimni boshqariladigan qiladi, chunki butun tizimni emas, bir vaqtda bir modulni o'ylash mumkin.

1. Modullik nima

Katta tizim → kichik, mustaqil qismlar (app'lar). Har qism bir vazifa.

2. Afzalliklar

Afzallik Tafsilot
Tushunarlilik Kichik qism oson
Mustaqillik Biri boshqasiga ta'sir qilmaydi
Qayta ishlatish Modul boshqa joyda
Jamoa Har dasturchi o'z moduli
Test Modul alohida sinaladi

3. "Bir vazifa, bir modul"

Har modul aniq bir mas'uliyat (kurslar app faqat kurslar). Bu chalkashlikni oldini oladi — nima qayerda aniq.

4. Modullik boshqa joyda

Daraja Modul
Django App
Python Paket/modul (19.1)
Funksiya Bir vazifa (SRP)
Mikroservis Xizmat
Frontend Komponent

5. Muhandislik saboqlari

  1. Katta tizimni kichik modullarga ajrat
  2. Bir vazifa, bir modul (aniq mas'uliyat)
  3. Modullik — tushunarlilik, mustaqillik, qayta ishlatish
  4. Bir vaqtda bir modul (butunni emas)

6. Xulosa

  1. Django app — modullik birligi
  2. Bir vazifa, bir modul (mustaqil)
  3. Modullik — katta tizimni boshqariladigan qiladi
  4. Tamoyil universal (paket, funksiya, xizmat)

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda Django loyiha va ilova tuzilmasini o'rgandik.

Eng muhim uch fikr:

  1. Project va app. Django ikki darajali: project — butun sayt (bir dona: sozlamalar, umumiy URL, baza), app — bir vazifali modul (ko'p: kurslar, foydalanuvchilar). Bir project ko'p app'dan iborat; app mustaqil va qayta ishlatiladigan. django-admin startproject va python manage.py startapp tayyor tuzilma yaratadi (kelishuvli fayllar: models.py, views.py, urls.py).

  2. settings.py va INSTALLED_APPS. settings.py — loyiha markaziy sozlamalari: DATABASES (baza), INSTALLED_APPS (faol app'lar), DEBUG (rivojlanishda True, ishlab chiqarishda False), SECRET_KEY (.envda). App INSTALLED_APPSga qo'shilsa, Django uni taniydi (modellari, migratsiyalari, admin). Django o'z app'lari (admin, auth) tayyor keladi.

  3. URL yo'naltirish va modullik. Project urls.py — asosiy yo'naltirgich; include bilan so'rovni app URL'lariga topshiradi (/kurslar/... → kurslar/urls.py). Har app o'z URL'iga ega (mustaqil). Bu modullik — kodni app'lar bo'yicha tashkil qiladi: har app bir vazifaga mas'ul, tushunarli, qayta ishlatiladigan. Katta loyiha — ko'p kichik, mustaqil app.

Keyingi darsda model ni o'rganamiz: Django ORM bilan ma'lumot modellarini yaratish, maydonlar turlari, Meta sozlamalari va model metodlari.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
21.2-dars: Loyiha va ilova — IlmHamroh