IlmHamroh
Python kursi/Django7/16-dars16 daqiqa
Mundarija (22)

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_string bilan 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 #}
html
<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:

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

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

html
{% 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 (|):

html
{{ 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:

html
<!-- 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):

html
{{ foydalanuvchi_matni }}
<!-- "<script>" → "&lt;script&gt;" (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) → foydalanuvchi

Template — 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

html
<!-- 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 %}
python
# 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_string bilan sinaladi.

Misol 1 — Sintaksis va kontekst

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

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

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

Misol 2 — Sikllar va shartlar

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

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

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

Misol 3 — Filtrlar va avtomatik escape

python
"""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): {'&lt;script&gt;' in natija}")
    print("  ⭐ filtrlar formatlaydi; avtomatik escape — XSS himoya")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 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: &lt;script&gt;alert(1)&lt;/script&gt;
  <script> bajarilmaydi (escape qilingan): True
  ⭐ filtrlar formatlaydi; avtomatik escape — XSS himoya

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

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

text
=== 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&#x27;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'q

Nima 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

python
html = "<div>" + nom + "</div>"              # ⚠️ XSS, chalkash
# ✅ template: <div>{{ nom }}</div>

2. {% endfor %}/{% endif %} unutish

html
{% for k in kurslar %}{{ k }}                <!-- ❌ endfor yo'q -->
{% for k in kurslar %}{{ k }}{% endfor %}    <!-- ✅ -->

3. Escape'ni keraksiz o'chirish

html
{{ matn|safe }}                              <!-- ⚠️ XSS xavfi -->
{{ matn }}                                    <!-- ✅ avtomatik escape -->

4. Mantiqni template'da

html
{% if narx * 1.2 > chegara %}                <!-- ⚠️ hisob template'da -->
<!-- ✅ hisob view/model'da, template faqat ko'rsatadi -->

5. Meros o'rniga takror

html
<!-- har sahifada <nav>, <footer> qo'lda -->  <!-- ⚠️ takror -->
{% extends "asos.html" %}                     <!-- ✅ -->

6. {{ }} ichida murakkab ifoda

html
{{ narx + soliq }}                           <!-- ❌ ishlamaydi -->
<!-- ✅ view'da hisoblab kontekstga bering -->

7. O'zgaruvchi topilmasa

html
{{ 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

  1. HTML'ni template'da yozing (Python satrida emas).

  2. Mantiqni view/model'da qoldiring (template — ko'rinish).

  3. Avtomatik escape'ni o'chirmang (XSS himoya).

  4. Meros ({% extends %}) bilan takrorni yo'qoting.

  5. Filtrlar bilan formatlang (date, default).

  6. {% empty %} bilan bo'sh ro'yxatni boshqaring.

  7. {{ }} ichida murakkab ifoda yozmang (view'da hisoblang).

  8. |safeni faqat ishonchli matnga ishlating.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. O'zgaruvchi (qiymat chiqaradi)
  2. Tag (mantiq — sikl, shart)
  3. Template'ga beriladigan ma'lumot
  4. Sikl (ro'yxat bo'yicha)
  5. Sikl tartib raqami (1 dan)
  6. Shart (shartli ko'rsatish)
  7. Qiymatni o'zgartiradi (|)
  8. Boshqa template'ni meros olish
  9. Merosda to'ldiriladigan joy
  10. HTML belgilarini zararsizlashtirish (XSS himoya)
  11. View/modelda (template — ko'rinish)
  12. Ro'yxat bo'sh bo'lsa

Vazifa 2: Xatolarni tuzating

python
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            # meros
Javoblar
python
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:

  1. Sarlavha, narx, tavsif
  2. Darslar ro'yxati ({% for %})
  3. Faol/nofaol ({% if %})
  4. render_to_string bilan test

Vazifa 4: Filtrlar to'plami

Turli filtrlar:

  1. upper, truncatewords, date, default
  2. Ketma-ket filtr
  3. Har biriga misol
  4. Natijani tekshirish

Vazifa 5: Template meros

Meros tizimi:

  1. asos.html (menu, footer)
  2. bosh.html, kurs.html (kengaytiradi)
  3. Har biri o'z block'lari
  4. Render va tekshirish

Vazifa 6: XSS himoya

Escape sinovi:

  1. Foydalanuvchi matni (<script>, <img>)
  2. Avtomatik escape natijasi
  3. |safe xavfi (namoyish)
  4. 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

  1. Xavfsizlik standart holda yoqiq bo'lsin
  2. O'chirish ataylab (yoqish emas)
  3. Unutish xavfsiz tomonga og'sin
  4. Inson xatosini hisobga ol (unutish tabiiy)

6. Xulosa

  1. Django escape — xavfsiz standart (avtomatik)
  2. O'chirish ataylab (|safe), yoqish emas
  3. Unutsa ham xavfsiz (inson xatosiga bardoshli)
  4. 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:

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

  2. 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).

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

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
21.7-dars: Template — IlmHamroh