Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Template sintaksisi
- 2.2. Kontekst (ma'lumot)
- 2.3. Sikllar ({% for %})
- 2.4. Shartlar ({% if %})
- 2.5. Filtrlar
- 2.6. Template meros
- 2.7. Avtomatik escape (XSS himoya)
- 2.8. Template — ko'rinish qatlami
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Sintaksis va kontekst
- Misol 2 — Sikllar va shartlar
- Misol 3 — Filtrlar va avtomatik escape
- Misol 4 — Amaliy: template meros
- 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.7-dars: Template
21-QISM — DJANGO · 7-dars
1. Kirish va motivatsiya
View mantiqni bajaradi, lekin foydalanuvchi HTML sahifani ko'radi. Bu HTML'ni qanday yaratami? Har safar Python'da satr yig'ish — chalkash va xavfli. Yechim — template (shablon): HTML fayli ichida maxsus belgilar ({{ }}, {% %}) bilan ma'lumot joylashtiriladigan joylar. View ma'lumot beradi, template uni HTML'ga shakllaydi.
Template — MTV ning "T" (Template) qismi: ko'rinish (presentation). Django template tili — o'zgaruvchilar, sikllar, shartlar va filtrlar bilan HTML yaratadi. Muhimi — u xavfsiz (avtomatik HTML escape — XSS himoya) va meros (template inheritance) bilan takrorni yo'qotadi.
Real vaziyat. Bir jamoa HTML'ni view'da Python satri bilan yasardi (html = "<div>" + nom + "</div>"). Kod o'qib bo'lmaydigan, foydalanuvchi kiritgan nom (masalan, <script>) sahifaga tushdi — XSS hujumi. Har sahifada bir xil sarlavha/menu takrorlanardi. Jamoa template'larga o'tdi: HTML fayllar, avtomatik escape (XSS yo'q), {% extends %} bilan umumiy tuzilma. Kod toza, xavfsiz, takrorsiz bo'ldi.
Bu darsda template'ni — sintaksis, sikl/shart, filtrlar, meros va xavfsizlikni o'rganamiz.
Bu darsda:
- Template sintaksisi (
{{ }},{% %}) - Kontekst (view'dan ma'lumot)
- Sikllar (
{% for %}) - Shartlar (
{% if %}) - Filtrlar (
{{ ...|filter }}) - Template meros (
{% extends %},{% block %}) - Avtomatik escape (XSS himoya)
- Amaliy: to'liq template
ℹ Misollarda Django template
Template/render_to_stringbilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. Template sintaksisi
Template — HTML ichida ikki xil belgi:
| Belgi | Vazifa | Misol |
|---|---|---|
{{ }} |
O'zgaruvchi (qiymat) | {{ nom }} |
{% %} |
Tag (mantiq) | {% if %}, {% for %} |
{# #} |
Izoh | {# eslatma #} |
<h1>{{ kurs.nom }}</h1>
<p>Narx: {{ kurs.narx }} so'm</p>
{% if kurs.faol %}<span>Faol</span>{% endif %} {{ }} — qiymatni chiqaradi (o'zgaruvchi, atribut, metod); {% %} — mantiq (sikl, shart, meros). Bu HTML va ma'lumotni ajratadi (dizayn va mantiq alohida).
2.2. Kontekst (ma'lumot)
Template kontekst (ma'lumot lug'ati) bilan render qilinadi:
from django.template import Template, Context
t = Template("Salom, {{ ism }}! Kurslar: {{ soni }}")
t.render(Context({"ism": "Ali", "soni": 3}))
# → "Salom, Ali! Kurslar: 3" Kontekst — template'ga beriladigan ma'lumot ({"ism": "Ali"}). Template'dagi {{ ism }} kontekstdan to'ldiriladi. View bu ma'lumotni beradi (model'dan) — template uni ko'rsatadi.
2.3. Sikllar ({% for %})
Ro'yxat bo'yicha takrorlash:
<ul>
{% for kurs in kurslar %}
<li>{{ kurs.nom }} — {{ kurs.narx }}</li>
{% endfor %}
</ul>| Yordamchi | Ma'no |
|---|---|
forloop.counter |
Tartib raqami (1 dan) |
forloop.first |
Birinchimi |
forloop.last |
Oxirgimi |
{% empty %} |
Ro'yxat bo'sh bo'lsa |
{% for ... %}...{% endfor %} — ro'yxat elementlarini chiqaradi. forloop — sikl holati (raqam, birinchi/oxirgi). {% empty %} — bo'sh ro'yxat uchun. Bu ma'lumot ro'yxatini HTML'ga aylantiradi.
2.4. Shartlar ({% if %})
Shartli ko'rsatish:
{% if kurs.narx > 100 %}
<span>Qimmat</span>
{% elif kurs.narx > 50 %}
<span>O'rtacha</span>
{% else %}
<span>Arzon</span>
{% endif %} {% if ... %}...{% endif %} — shartli blok (elif, else bilan). Solishtirish (>, ==), mantiq (and, or, not) qo'llanadi. Bu ma'lumotga qarab turli HTML ko'rsatadi.
2.5. Filtrlar
Filtr — qiymatni o'zgartiradi (|):
{{ nom|upper }} <!-- BOSH HARF -->
{{ matn|truncatewords:10 }} <!-- 10 so'z -->
{{ narx|default:"0" }} <!-- bo'sh bo'lsa 0 -->
{{ sana|date:"d.m.Y" }} <!-- sana formati -->
{{ royxat|length }} <!-- uzunlik -->| Filtr | Vazifa |
|---|---|
upper/lower |
Katta/kichik harf |
truncatewords:N |
N so'zga qisqartirish |
default:"..." |
Bo'sh bo'lsa standart |
date:"..." |
Sana formati |
length |
Uzunlik |
Filtr — qiymatni ko'rsatishdan oldin o'zgartiradi ({{ qiymat|filtr:argument }}). Django ko'p tayyor filtr beradi (matn, sana, son). Bu formatlashni template'da qiladi.
2.6. Template meros
{% extends %} va {% block %} — umumiy tuzilmani meros olish:
<!-- asos.html -->
<html><body>
<h1>{% block sarlavha %}Standart{% endblock %}</h1>
{% block mazmun %}{% endblock %}
</body></html>
<!-- kurs.html -->
{% extends "asos.html" %}
{% block sarlavha %}{{ nom }}{% endblock %}
{% block mazmun %}Narx: {{ narx }}{% endblock %} Meros — umumiy tuzilma (asos.html: menu, footer) bir joyda, sahifalar uni kengaytiradi ({% extends %}) va {% block %} larni to'ldiradi. Bu takrorni yo'qotadi (DRY) — umumiy qism bir joyda.
2.7. Avtomatik escape (XSS himoya)
Django o'zgaruvchini avtomatik escape qiladi (XSS himoya):
{{ foydalanuvchi_matni }}
<!-- "<script>" → "<script>" (zararsiz) --> Django {{ }} ichidagi HTML belgilarni (<, >, &) avtomatik escape qiladi — foydalanuvchi kiritgan <script> matn bo'lib qoladi (bajarilmaydi). Bu XSS (cross-site scripting) hujumidan himoya (20.11 — "mijozga ishonma"). Bu — Django xavfsizligining muhim qismi.
2.8. Template — ko'rinish qatlami
Template — MTV ning "ko'rinish" qismi:
View (mantiq) → kontekst (ma'lumot) → Template (HTML) → foydalanuvchiTemplate — faqat ko'rinish (presentation): ma'lumotni HTML'ga shakllaydi. Mantiq (hisob-kitob) template'da emas, view/model'da. Bu ajratish — dizayner template bilan, dasturchi kod bilan ishlay oladi (mustaqil).
3. Tez ma'lumotnoma
<!-- o'zgaruvchi va tag -->
{{ kurs.nom }} <!-- qiymat -->
{% if kurs.faol %}Faol{% endif %} <!-- shart -->
{% for k in kurslar %}{{ k.nom }}{% endfor %} <!-- sikl -->
{{ nom|upper }} <!-- filtr -->
<!-- meros -->
{% extends "asos.html" %}
{% block mazmun %}...{% endblock %}# view'da:
from django.shortcuts import render
def kurslar(request):
return render(request, "kurslar.html", {"kurslar": Kurs.objects.all()})Sintaksis
{{ o'zgaruvchi }} · {% tag %} · {{ qiymat|filtr }} · {# izoh #}4. Batafsil misollar
Misollarda Django template
Template/render_to_stringbilan sinaladi.
Misol 1 — Sintaksis va kontekst
"""template sintaksisi ({{ }}, {% %}); kontekst (ma'lumot); o'zgaruvchi va atribut; qiymat chiqarish."""
import warnings
warnings.filterwarnings("ignore")
import django
from django.conf import settings
settings.configure(
DEBUG=False,
TEMPLATES=[{"BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": False, "OPTIONS": {}}],
)
django.setup()
from django.template import Context, Template
def main() -> None:
print("=== 1. Oddiy o'zgaruvchi ===")
t = Template("Salom, {{ ism }}!")
print(f" {t.render(Context({'ism': 'Ali'}))}")
print("\n=== 2. Bir necha o'zgaruvchi ===")
t = Template("{{ nom }} kursi {{ narx }} so'm")
print(f" {t.render(Context({'nom': 'Python', 'narx': 100}))}")
print("\n=== 3. Atribut (nuqta bilan) ===")
t = Template("Kurs: {{ kurs.nom }}, narx: {{ kurs.narx }}")
print(f" {t.render(Context({'kurs': {'nom': 'Go', 'narx': 120}}))}")
print("\n=== 4. Izoh (chiqmaydi) ===")
t = Template("Matn{# bu izoh #} davomi")
print(f" {t.render(Context({}))}")
print(" ⭐ {{ }} qiymat, {% %} mantiq, {# #} izoh; kontekst — ma'lumot")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Oddiy o'zgaruvchi ===
Salom, Ali!
=== 2. Bir necha o'zgaruvchi ===
Python kursi 100 so'm
=== 3. Atribut (nuqta bilan) ===
Kurs: Go, narx: 120
=== 4. Izoh (chiqmaydi) ===
Matn davomi
⭐ {{ }} qiymat, {% %} mantiq, {# #} izoh; kontekst — ma'lumotNima ko'rsatdi: 2.1, 2.2, 2.8-bo'limlar.
Misol 2 — Sikllar va shartlar
"""sikl ({% for %}, forloop); shart ({% if %}/{% elif %}/{% else %}); {% empty %}; ro'yxatni HTML'ga."""
import warnings
warnings.filterwarnings("ignore")
import django
from django.conf import settings
settings.configure(
DEBUG=False,
TEMPLATES=[{"BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": False, "OPTIONS": {}}],
)
django.setup()
from django.template import Context, Template
def main() -> None:
print("=== 1. Sikl (for) ===")
t = Template("{% for k in kurslar %}{{ k.nom }} {% endfor %}")
print(f" {t.render(Context({'kurslar': [{'nom': 'Python'}, {'nom': 'Go'}, {'nom': 'Rust'}]})).strip()}")
print("\n=== 2. forloop (tartib raqami) ===")
t = Template("{% for k in kurslar %}{{ forloop.counter }}.{{ k }} {% endfor %}")
print(f" {t.render(Context({'kurslar': ['a', 'b', 'c']})).strip()}")
print("\n=== 3. Shart (if/elif/else) ===")
t = Template("{% if narx > 100 %}Qimmat{% elif narx > 50 %}O'rta{% else %}Arzon{% endif %}")
for narx in [150, 70, 30]:
print(f" narx={narx}: {t.render(Context({'narx': narx}))}")
print("\n=== 4. Bo'sh ro'yxat (empty) ===")
t = Template("{% for k in kurslar %}{{ k }}{% empty %}Kurs yo'q{% endfor %}")
print(f" bo'sh: {t.render(Context({'kurslar': []}))}")
print(f" to'la: {t.render(Context({'kurslar': ['Python']}))}")
print(" ⭐ {% for %} sikl (forloop); {% if %} shart; {% empty %} bo'sh")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Sikl (for) ===
Python Go Rust
=== 2. forloop (tartib raqami) ===
1.a 2.b 3.c
=== 3. Shart (if/elif/else) ===
narx=150: Qimmat
narx=70: O'rta
narx=30: Arzon
=== 4. Bo'sh ro'yxat (empty) ===
bo'sh: Kurs yo'q
to'la: Python
⭐ {% for %} sikl (forloop); {% if %} shart; {% empty %} bo'shNima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — Filtrlar va avtomatik escape
"""filtrlar (upper, truncatewords, default, length); avtomatik HTML escape (XSS himoya); ketma-ket filtr."""
import warnings
warnings.filterwarnings("ignore")
import django
from django.conf import settings
settings.configure(
DEBUG=False,
TEMPLATES=[{"BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": False, "OPTIONS": {}}],
)
django.setup()
from django.template import Context, Template
def main() -> None:
print("=== 1. Matn filtrlari ===")
t = Template("{{ nom|upper }} / {{ nom|lower }}")
print(f" {t.render(Context({'nom': 'Python'}))}")
print("\n=== 2. truncatewords va default ===")
t = Template("{{ matn|truncatewords:3 }} | {{ bosh|default:'yo\\'q' }}")
print(f" {t.render(Context({'matn': 'bu juda uzun matn davomi', 'bosh': ''}))}")
print("\n=== 3. length va ketma-ket filtr ===")
t = Template("soni: {{ royxat|length }}, birinchi: {{ royxat.0|upper }}")
print(f" {t.render(Context({'royxat': ['python', 'go']}))}")
print("\n=== 4. ⚠️ Avtomatik escape (XSS himoya) ===")
t = Template("{{ xavfli }}")
natija = t.render(Context({"xavfli": "<script>alert(1)</script>"}))
print(f" kiritilgan: <script>alert(1)</script>")
print(f" chiqish: {natija}")
print(f" <script> bajarilmaydi (escape qilingan): {'<script>' in natija}")
print(" ⭐ filtrlar formatlaydi; avtomatik escape — XSS himoya")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Matn filtrlari ===
PYTHON / python
=== 2. truncatewords va default ===
bu juda uzun … | yo'q
=== 3. length va ketma-ket filtr ===
soni: 2, birinchi: PYTHON
=== 4. ⚠️ Avtomatik escape (XSS himoya) ===
kiritilgan: <script>alert(1)</script>
chiqish: <script>alert(1)</script>
<script> bajarilmaydi (escape qilingan): True
⭐ filtrlar formatlaydi; avtomatik escape — XSS himoyaNima ko'rsatdi: 2.5, 2.7-bo'limlar.
Misol 4 — Amaliy: template meros
Umumiy tuzilmani (menu, footer) asos.htmlda, sahifalar uni kengaytiradi. Kurs sahifasini meros bilan quramiz — bu real Django loyihasidagi template tuzilishi.
"""template meros ({% extends %}, {% block %}); umumiy tuzilma bir joyda; sahifa block'larni to'ldiradi; DRY."""
import warnings
warnings.filterwarnings("ignore")
import os
import tempfile
import django
from django.conf import settings
TDIR = tempfile.mkdtemp()
# asos shablon (umumiy tuzilma)
with open(os.path.join(TDIR, "asos.html"), "w", encoding="utf-8") as f:
f.write(
"<html><head><title>{% block sarlavha %}Wisar{% endblock %}</title></head>"
"<body><nav>Menu</nav>"
"<main>{% block mazmun %}{% endblock %}</main>"
"<footer>Wisar 2026</footer></body></html>"
)
# kurs sahifasi (asosni kengaytiradi)
with open(os.path.join(TDIR, "kurs.html"), "w", encoding="utf-8") as f:
f.write(
"{% extends 'asos.html' %}"
"{% block sarlavha %}{{ kurs.nom }} — Wisar{% endblock %}"
"{% block mazmun %}<h1>{{ kurs.nom }}</h1><p>Narx: {{ kurs.narx }} so'm</p>"
"{% for dars in kurs.darslar %}<li>{{ dars }}</li>{% endfor %}{% endblock %}"
)
settings.configure(
DEBUG=False,
TEMPLATES=[{"BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [TDIR], "APP_DIRS": False, "OPTIONS": {}}],
)
django.setup()
from django.template.loader import render_to_string
def main() -> None:
kontekst = {"kurs": {"nom": "Python", "narx": 100, "darslar": ["Kirish", "O'zgaruvchilar"]}}
html = render_to_string("kurs.html", kontekst)
print("=== 1. Meros natijasi (to'liq HTML) ===")
print(f" {html}")
print("\n=== 2. asos.html'dan (menu, footer) ===")
print(f" <nav>Menu</nav> bor: {'<nav>Menu</nav>' in html}")
print(f" <footer> bor: {'Wisar 2026' in html}")
print("\n=== 3. kurs.html'dan (block to'ldirildi) ===")
print(f" sarlavha: {'Python — Wisar' in html}")
print(f" darslar: {'<li>Kirish</li>' in html}")
print("\n=== 4. DRY (umumiy tuzilma bir joyda) ===")
print(" menu/footer asos.html'da — har sahifa meros oladi")
print(" ⭐ {% extends %} + {% block %} — umumiy tuzilma, takror yo'q")
import shutil
shutil.rmtree(TDIR, ignore_errors=True)
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Meros natijasi (to'liq HTML) ===
<html><head><title>Python — Wisar</title></head><body><nav>Menu</nav><main><h1>Python</h1><p>Narx: 100 so'm</p><li>Kirish</li><li>O'zgaruvchilar</li></main><footer>Wisar 2026</footer></body></html>
=== 2. asos.html'dan (menu, footer) ===
<nav>Menu</nav> bor: True
<footer> bor: True
=== 3. kurs.html'dan (block to'ldirildi) ===
sarlavha: True
darslar: True
=== 4. DRY (umumiy tuzilma bir joyda) ===
menu/footer asos.html'da — har sahifa meros oladi
⭐ {% extends %} + {% block %} — umumiy tuzilma, takror yo'qNima ko'rsatdi: 2.6, 2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "HTML'ni Python satrida" | Template (ajratilgan) |
"{{ }} va {% %} bir xil" |
{{ }} qiymat, {% %} mantiq |
| "Escape qo'lda" | Avtomatik (XSS himoya) |
| "Har sahifada menu takror" | Meros ({% extends %}) |
| "Mantiq template'da" | View/modelda (template — ko'rinish) |
| "Filtr keraksiz" | Formatlash (matn, sana) |
| "Escape'ni o'chirish xavfsiz" | Ehtiyot (XSS xavfi) |
| "Template — Python kodi" | Cheklangan til (ko'rinish) |
6. Keng tarqalgan xatolar va yechimlari
1. HTML'ni Python satrida
html = "<div>" + nom + "</div>" # ⚠️ XSS, chalkash
# ✅ template: <div>{{ nom }}</div>2. {% endfor %}/{% endif %} unutish
{% for k in kurslar %}{{ k }} <!-- ❌ endfor yo'q -->
{% for k in kurslar %}{{ k }}{% endfor %} <!-- ✅ -->3. Escape'ni keraksiz o'chirish
{{ matn|safe }} <!-- ⚠️ XSS xavfi -->
{{ matn }} <!-- ✅ avtomatik escape -->4. Mantiqni template'da
{% if narx * 1.2 > chegara %} <!-- ⚠️ hisob template'da -->
<!-- ✅ hisob view/model'da, template faqat ko'rsatadi -->5. Meros o'rniga takror
<!-- har sahifada <nav>, <footer> qo'lda --> <!-- ⚠️ takror -->
{% extends "asos.html" %} <!-- ✅ -->6. {{ }} ichida murakkab ifoda
{{ narx + soliq }} <!-- ❌ ishlamaydi -->
<!-- ✅ view'da hisoblab kontekstga bering -->7. O'zgaruvchi topilmasa
{{ yoq_ozgaruvchi }} <!-- bo'sh (xato emas) -->
{{ ozgaruvchi|default:"—" }} <!-- ✅ standart -->7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 21.6-dars (o'tilgan): view — template'ni render qiladi
- 21.8-dars: forma — template'da forma ko'rsatish
- 01-qism (o'tilgan): HTML, CSS — template asosi
- 20.11-dars (o'tilgan): XSS — "mijozga ishonma"
- 21.16-dars: deploy — static fayllar (CSS, JS)
8. Eng yaxshi amaliyotlar
HTML'ni template'da yozing (Python satrida emas).
Mantiqni view/model'da qoldiring (template — ko'rinish).
Avtomatik escape'ni o'chirmang (XSS himoya).
Meros (
{% extends %}) bilan takrorni yo'qoting.Filtrlar bilan formatlang (
date,default).{% empty %}bilan bo'sh ro'yxatni boshqaring.{{ }}ichida murakkab ifoda yozmang (view'da hisoblang).|safeni faqat ishonchli matnga ishlating.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # {{ }} nima?
2. # {% %} nima?
3. # kontekst nima?
4. # {% for %} nima?
5. # forloop.counter nima?
6. # {% if %} nima?
7. # filtr nima?
8. # {% extends %} nima?
9. # {% block %} nima?
10. # avtomatik escape nima?
11. # mantiq qayerda?
12. # {% empty %} qachon?Javoblar
- O'zgaruvchi (qiymat chiqaradi)
- Tag (mantiq — sikl, shart)
- Template'ga beriladigan ma'lumot
- Sikl (ro'yxat bo'yicha)
- Sikl tartib raqami (1 dan)
- Shart (shartli ko'rsatish)
- Qiymatni o'zgartiradi (
|) - Boshqa template'ni meros olish
- Merosda to'ldiriladigan joy
- HTML belgilarini zararsizlashtirish (XSS himoya)
- View/modelda (template — ko'rinish)
- Ro'yxat bo'sh bo'lsa
Vazifa 2: Xatolarni tuzating
1. html = "<div>" + nom + "</div>" # template
2. {% for k in kurslar %}{{ k }} # endfor
3. {{ matn|safe }} # escape
4. {% if narx * 1.2 > 100 %} # hisob
5. # har sahifada menu qo'lda # merosJavoblar
1. <div>{{ nom }}</div> # template
2. {% for k in kurslar %}{{ k }}{% endfor %}
3. {{ matn }} # avtomatik escape
4. # view'da hisoblang, template ko'rsatadi
5. {% extends "asos.html" %}Vazifa 3: Kurs sahifasi
Kurs template'i:
- Sarlavha, narx, tavsif
- Darslar ro'yxati (
{% for %}) - Faol/nofaol (
{% if %}) render_to_stringbilan test
Vazifa 4: Filtrlar to'plami
Turli filtrlar:
upper,truncatewords,date,default- Ketma-ket filtr
- Har biriga misol
- Natijani tekshirish
Vazifa 5: Template meros
Meros tizimi:
asos.html(menu, footer)bosh.html,kurs.html(kengaytiradi)- Har biri o'z block'lari
- Render va tekshirish
Vazifa 6: XSS himoya
Escape sinovi:
- Foydalanuvchi matni (
<script>,<img>) - Avtomatik escape natijasi
|safexavfi (namoyish)- Xavfsizlik tahlili
Vazifa 7: O'ylash
Django template avtomatik escape qiladi — foydalanuvchi kiritgan <script> bajarilmaydi (XSS himoya). Bu "xavfsiz standart" (secure by default) tamoyili: xavfsizlik yoqilgan holda keladi, dasturchi uni o'chirishi (|safe) kerak (aksincha emas). "Xavfsiz standart" nima uchun "xavfsizlikni qo'shish" dan yaxshiroq, va bu tamoyil (unutsa ham xavfsiz) qayerda yana muhim?
Javob
Qisqa javob: "Xavfsiz standart" — xavfsizlik standart holda yoqilgan (Django escape avtomatik). Dasturchi uni ataylab o'chirishi kerak (|safe). Buning aksi — "xavfsizlikni qo'shish" (escape'ni har joyda qo'lda yozish) — biror joyni unutsa, teshik ochiladi. Xavfsiz standart afzal, chunki unutish xavfsiz tomonga og'adi: dasturchi escape'ni unutsa ham himoya bor. Bu inson xatosini hisobga oladi (unutish tabiiy). "Xavfsiz standart" — parol tekshiruvi, HTTPS, ruxsat rad etish (default deny) kabi joylarda muhim: xato holatda xavfsiz bo'lsin.
1. Xavfsiz standart vs qo'shish
| Xavfsiz standart | Xavfsizlikni qo'shish |
|---|---|
| Escape avtomatik | Escape qo'lda |
| Unutsa — xavfsiz | Unutsa — teshik |
| O'chirish ataylab | Yoqish ataylab |
2. Nega xavfsiz standart afzal
Inson unutadi (tabiiy). Xavfsiz standartda unutish xavfsiz tomonga og'adi (himoya bor). Xavfsizlikni qo'shishda unutish — teshik (xavfli tomonga).
3. "Unutsa ham xavfsiz"
Xavfsizlik inson xatosiga bardoshli bo'lsin: bir dasturchi, bir joyda unutsa ham tizim xavfsiz qolsin. Bu "chuqurlikda himoya" (defense in depth).
4. "Xavfsiz standart" boshqa joyda
| Soha | Xavfsiz standart |
|---|---|
| Template | Escape yoqiq |
| Ruxsat | Default deny (rad et) |
| Aloqa | HTTPS majburiy |
| Parol | Hash majburiy |
| CORS | Yopiq (ochish ataylab) |
5. Muhandislik saboqlari
- Xavfsizlik standart holda yoqiq bo'lsin
- O'chirish ataylab (yoqish emas)
- Unutish xavfsiz tomonga og'sin
- Inson xatosini hisobga ol (unutish tabiiy)
6. Xulosa
- Django escape — xavfsiz standart (avtomatik)
- O'chirish ataylab (
|safe), yoqish emas - Unutsa ham xavfsiz (inson xatosiga bardoshli)
- Tamoyil keng (default deny, HTTPS, hash)
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda Django template'ni o'rgandik.
Eng muhim uch fikr:
Template sintaksisi va kontekst. Template — HTML fayli ichida ikki asosiy belgi:
{{ }}(o'zgaruvchi — qiymat chiqaradi),{% %}(tag — mantiq: sikl, shart, meros),{# #}(izoh). Template kontekst (ma'lumot lug'ati) bilan render qilinadi: view model'dan ma'lumot beradi, template{{ }}orqali ko'rsatadi. Bu HTML (dizayn) va ma'lumotni (mantiq) ajratadi.Sikl, shart, filtr va meros.
{% for %}(ro'yxat —forloop,{% empty %}bilan),{% if %}/{% elif %}/{% else %}(shartli ko'rsatish), filtrlar ({{ qiymat|filtr:arg }}—upper,truncatewords,date,default) formatlash uchun. Template meros —{% extends "asos.html" %}va{% block %}bilan umumiy tuzilmani (menu, footer) bir joyda saqlab, sahifalar uni kengaytiradi — bu takrorni yo'qotadi (DRY).Xavfsizlik va ko'rinish qatlami. Django o'zgaruvchini avtomatik escape qiladi — foydalanuvchi kiritgan
<script>matn bo'lib qoladi (bajarilmaydi), bu XSS hujumidan himoya. Bu "xavfsiz standart" tamoyili: himoya yoqilgan holda keladi, o'chirish (|safe) ataylab — unutsa ham xavfsiz. Template — faqat ko'rinish (presentation): mantiq (hisob-kitob) view/model'da, template ma'lumotni shakllaydi. Bu ajratish dizayner va dasturchini mustaqil qiladi.
Keyingi darsda forma ni o'rganamiz: Django forma bilan foydalanuvchi ma'lumotini qabul qilish, validatsiya, ModelForm va forma'ni template'da ko'rsatish.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!