Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Project va app
- 2.2. Loyiha tuzilmasi
- 2.3. settings.py — sozlamalar
- 2.4. INSTALLED_APPS
- 2.5. URL yo'naltirish
- 2.6. include bilan app URL'lari
- 2.7. startproject va startapp
- 2.8. Modullik (app qayta ishlatish)
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Sozlamalar (settings)
- Misol 2 — Ko'p app'li URL yo'naltirish
- Misol 3 — App konfiguratsiyasi va ro'yxatdan o'tish
- Misol 4 — Amaliy: ko'p app'li loyiha
- 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
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— sozlamalarINSTALLED_APPS— app'larni ro'yxatdan o'tkazish- URL yo'naltirish (project + app)
includebilan app URL'laristartproject/startappbuyruqlari- Amaliy: ko'p app'li loyiha
ℹ Misollarda Django standalone sozlanadi — odatda
django-adminbuyruqlari 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 nuqtasipython 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:
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:
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:
# 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:
# 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
# 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/url4. Batafsil misollar
Misollarda Django standalone sozlanadi (odatda
django-adminyaratadi).
Misol 1 — Sozlamalar (settings)
"""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:
=== 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
"""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:
=== 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
"""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:
=== 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.
"""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:
=== 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
INSTALLED_APPS = [...] # ⚠️ kurslar yo'q
INSTALLED_APPS = [..., "kurslar"] # ✅2. Hamma kodni bitta app/faylda
# 2000 qatorli views.py # ⚠️
# kurslar/, users/, izohlar/ — alohida app # ✅3. DEBUG=True ishlab chiqarishda
DEBUG = True # ⚠️ xavfli (xato oshkor)
DEBUG = False # ✅ ishlab chiqarishda4. include o'rniga to'g'ridan URL
# project urls'da barcha app URL'lari # ⚠️ aralash
path("kurslar/", include("kurslar.urls")) # ✅5. SECRET_KEYni kodda
SECRET_KEY = "12345" # ⚠️ git'da
SECRET_KEY = os.environ["SECRET_KEY"] # ✅ .env6. Project va app nomini bir xil qilish
# project=kurslar, app=kurslar # ⚠️ chalkash
# project=mysite, app=kurslar # ✅7. App URL'larini project'da aralashtirish
# barcha view project urls'da # ⚠️
# app URL'lari app/urls.py'da # ✅ modullik7. 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
Kodni app'larga bo'ling (har biri bir vazifa).
App'ni
INSTALLED_APPSga qo'shing.App URL'larini
includebilan ulang (modullik).SECRET_KEYni.envda saqlang.DEBUG=Falseishlab chiqarishda.Project va app nomlarini farqlang.
Kichik, mustaqil app'lar yozing (qayta ishlatiladigan).
Kelishuvli fayl nomlarini saqlang (
models.py,views.py,urls.py).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- Project — butun sayt, app — bir modul (project ⊃ app)
- Loyiha markaziy sozlamalari
- Loyihadagi faol app'lar ro'yxati
- Project tuzilmasi (settings, urls, manage.py)
- App tuzilmasi (models, views, urls)
- App URL'larini project'ga ulaydi
False(xavfsizlik).envda (git'da emas)- Loyiha boshqaruvi (runserver, migrate)
- Ko'p (cheklovsiz)
- App ichida (
app/urls.py) - Ha (mustaqil, boshqa loyihada)
Vazifa 2: Xatolarni tuzating
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 # appJavoblar
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'larVazifa 3: Loyiha rejalash
Blog loyihasi tuzilmasi:
- Project nomi va app'lar (blog, users, izoh)
- Har app — model, view, URL
INSTALLED_APPSro'yxati- URL yo'naltirish (
include)
Vazifa 4: Sozlamalar
settings bilan ishlash (standalone):
DATABASES,INSTALLED_APPS,DEBUG- Til va vaqt zonasi
- Sozlamalarga kirish va chiqarish
- Django app'lari vs o'z app'lar
Vazifa 5: Ko'p app URL
Uch app'li URL tizimi:
kurslar,users,izohlarapp'lari- Har biri o'z URL'iga (
include) Clientbilan har birini test- 404 holatini test
Vazifa 6: App registri
App va model registri:
apps.get_app_configs()bilan app'lar- Har app modellari
- Model app label va jadval nomi
- 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
- Katta tizimni kichik modullarga ajrat
- Bir vazifa, bir modul (aniq mas'uliyat)
- Modullik — tushunarlilik, mustaqillik, qayta ishlatish
- Bir vaqtda bir modul (butunni emas)
6. Xulosa
- Django app — modullik birligi
- Bir vazifa, bir modul (mustaqil)
- Modullik — katta tizimni boshqariladigan qiladi
- 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:
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 startprojectvapython manage.py startapptayyor tuzilma yaratadi (kelishuvli fayllar:models.py,views.py,urls.py).settings.pyvaINSTALLED_APPS.settings.py— loyiha markaziy sozlamalari:DATABASES(baza),INSTALLED_APPS(faol app'lar),DEBUG(rivojlanishdaTrue, ishlab chiqarishdaFalse),SECRET_KEY(.envda). AppINSTALLED_APPSga qo'shilsa, Django uni taniydi (modellari, migratsiyalari, admin). Django o'z app'lari (admin,auth) tayyor keladi.URL yo'naltirish va modullik. Project
urls.py— asosiy yo'naltirgich;includebilan 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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!