Bu modul Django’ning yuragini ochdi: brauzerdan kelgan so’rov URL orqali qanday qilib view funksiyasiga yetib boradi va u javobni qanday qaytaradi.
URL va View nima?
Har bir so’rov ikki savolga javob talab qiladi: qayerga keldi (URL) va nima qilish kerak (view). Django’da bu ikkisi aniq ajratilgan: urls.py — manzillar jadvali, views.py — o’sha manzillarga biriktirilgan Python funksiyalar. So’rov-javob sikli: brauzer /darslar/python so’raydi → Django URL jadvalidan mosini topadi → bog’langan view ishlaydi → view HttpResponse qaytaradi → brauzer uni ko’rsatadi.
Birinchi view va URL
View — so’rov (request) obyektini qabul qilib, javob qaytaradigan oddiy funksiya:
# darslar/views.py
from django.http import HttpResponse
def bosh_sahifa(request):
return HttpResponse("Darslar bo'limiga xush kelibsiz!")
App ichida o’z URL jadvali tuziladi:
# darslar/urls.py (yangi fayl)
from django.urls import path
from . import views
urlpatterns = [
path("", views.bosh_sahifa),
]
Va loyihaning bosh jadvaliga include bilan ulanadi:
# loyiha urls.py
from django.urls import path, include
urlpatterns = [
path("darslar/", include("darslar.urls")),
]
Endi http://127.0.0.1:8000/darslar/ manzili view’dagi matnni qaytaradi. Tez-tez uchraydigan xato: view’dan satrni to’g’ridan-to’g’ri return "matn" qilib qaytarish — Django HttpResponse (yoki uning avlodi) kutadi, aks holda ValueError beradi.
Dinamik URL segmentlari
Har bir dars uchun alohida path yozib chiqish o’rniga URL’ning bir qismi o’zgaruvchan qilinadi:
urlpatterns = [
path("<str:mavzu>", views.dars_sahifasi),
]
def dars_sahifasi(request, mavzu):
return HttpResponse(f"Siz tanlagan mavzu: {mavzu}")
/darslar/python so’ralsa, mavzu parametri "python" qiymatini oladi.
Natija:
Siz tanlagan mavzu: python
Path converter’lar
Segment turini converter belgilaydi — u qiymatni tekshiradi va view’ga tayyor turda uzatadi:
| Converter | Nimani qabul qiladi | View’da turi |
|---|---|---|
str |
/ dan boshqa istalgan matn |
str |
int |
Faqat butun son | int |
slug |
Harf, raqam, - va _ |
str |
path |
/ ni ham o’z ichiga olgan yo’l |
str |
Masalan path("<int:oy>", views.oylik_dars) bilan /darslar/3 ishlaydi, /darslar/mart esa mos kelmaydi — converter noto’g’ri turdagi so’rovni view’ga yetkazmaydi.
Dinamik view logikasi
View ichida odatiy Python ishlaydi — lug’atdan qiymat olish, shartlar, xatoni ushlash:
from django.http import HttpResponse, HttpResponseNotFound
darslar = {
"python": "Python — universal dasturlash tili.",
"django": "Django — Python veb-freymvorki.",
}
def dars_sahifasi(request, mavzu):
if mavzu not in darslar:
return HttpResponseNotFound("Bunday dars topilmadi.")
return HttpResponse(darslar[mavzu])
Mavjud bo’lmagan mavzu so’ralsa, foydalanuvchi 500 xato o’rniga tushunarli 404 javob oladi.
Redirect — yo’naltirish
Ba’zan javob berish emas, boshqa manzilga uzatish kerak (masalan, eski URL yangi manzilga ko’chgan bo’lsa):
from django.http import HttpResponseRedirect
def eski_manzil(request):
return HttpResponseRedirect("/darslar/python")
Brauzer 302 javobini olib, ko’rsatilgan manzilga o’zi o’tadi.
reverse va nomlangan URL’lar
Kodga /darslar/python kabi manzilni qattiq yozib qo’yish xavfli: URL o’zgarsa, uni ishlatgan har bir joyni qidirib tuzatishga to’g’ri keladi. Yechim — marshrutga nom berish:
urlpatterns = [
path("<str:mavzu>", views.dars_sahifasi, name="dars-sahifasi"),
]
va manzilni nomdan hosil qilish:
from django.urls import reverse
from django.http import HttpResponseRedirect
def eski_manzil(request):
yangi = reverse("dars-sahifasi", args=["python"]) # /darslar/python
return HttpResponseRedirect(yangi)
Endi URL sxemasi o’zgarsa ham reverse har doim to’g’ri manzilni qaytaradi. Tez-tez uchraydigan xato — NoReverseMatch: nom xato yozilgan yoki kerakli argument berilmagan; xato matnida qaysi nom topilmagani aniq ko’rsatiladi.
HTML qaytarish
HttpResponse ichiga HTML ham yozish mumkin:
def dars_sahifasi(request, mavzu):
javob = f"<h1>{mavzu.capitalize()}</h1><p>{darslar[mavzu]}</p>"
return HttpResponse(javob)
Lekin bu yo’l tez chegaraga uriladi: HTML Python satrlari ichida o’qib bo’lmas holga keladi, dizaynni o’zgartirish og’irlashadi. To’g’ri yechim — HTML’ni alohida fayllarga ajratish, ya’ni template’lar; bu keyingi modulning mavzusi.
Amaliyot
mashqlarapp’ida/mashqlar/salommanzili "Salom!" qaytaradigan view yozing.<str:ism>segmenti bilan/mashqlar/salom/Azizko’rinishidagi manzil "Salom, Aziz!" qaytarsin.- Oylar lug’atini tuzing (
{1: "Yanvar", ...}) va<int:raqam>bilan/mashqlar/oy/3so’ralganda oy nomini qaytaring; mavjud bo’lmagan raqamgaHttpResponseNotFoundbering. - Marshrutlarga
namebering va/mashqlar/hozirgi-oymanzilireverseyordamida joriy oy sahifasiga redirect qilsin. - Oy sahifasi javobini
<h1>sarlavha va<p>matnli HTML ko’rinishiga keltiring.
Modul materialini quyidagi test orqali mustahkamlang.