IlmHamroh
Python kursi/Django16/16-dars16 daqiqa
Mundarija (23)

21.16-dars: Deploy

21-QISM — DJANGO · 16-dars · 21-qism yakuni


1. Kirish va motivatsiya

Django loyihasi tayyor — model, view, API, auth. Lekin u sizning kompyuteringizda (runserver) ishlaydi. Uni butun dunyo ishlatishi uchun serverga chiqarish (deploy) kerak. Bu darsda Django'ni ishlab chiqarishga (production) chiqarishni o'rganamiz: xavfsiz sozlamalar, WSGI/ASGI server, static fayllar va xavfsizlik.

Deploy — rivojlanish (development) va ishlab chiqarish (production) o'rtasidagi ko'prik. runserver — faqat rivojlanish uchun (sekin, xavfsiz emas). Production'da haqiqiy server (Gunicorn, Nginx), xavfsiz sozlamalar (DEBUG=False), static fayllar (collectstatic) kerak. To'g'ri deploy — tez, xavfsiz, ishonchli ilova.

Real vaziyat. Bir jamoa Django'ni runserver va DEBUG=True bilan production'ga chiqardi — sekin, va xato sahifasida butun sozlamalar (SECRET_KEY, baza paroli) oshkor bo'ldi (DEBUG=True xavfi). Hujumchi buni ko'rdi. Jamoa to'g'ri deploy qildi: DEBUG=False, ALLOWED_HOSTS, Gunicorn, collectstatic, HTTPS. check --deploy bilan xavfsizlikni tekshirdi. Endi ilova tez, xavfsiz, ishonchli. To'g'ri deploy — production tayyorligi.

Bu darsda deploy'ni — production sozlamalar, WSGI, static va xavfsizlikni o'rganamiz va 21-qismni yakunlaymiz.

Bu darsda:

  • Development vs production
  • Production sozlamalar (DEBUG=False, ALLOWED_HOSTS)
  • SECRET_KEY va sirlar (.env)
  • WSGI/ASGI (Gunicorn)
  • Static fayllar (collectstatic)
  • Xavfsizlik sozlamalari (HTTPS, cookie)
  • check --deploy
  • 21-qism yakuni

ℹ Misollarda Django deploy sozlamalari bilan sinaladi.


2. Nazariya — chuqur tushuntirish

2.1. Development vs production

Ikki muhit — ikki sozlama:

Xususiyat Development Production
DEBUG True False
Server runserver Gunicorn/uWSGI
Baza SQLite PostgreSQL
Static Django Nginx/CDN
Xato Batafsil Umumiy (log)

Development — rivojlanish uchun (runserver, DEBUG=True, batafsil xato). Production — real foydalanuvchilar uchun (haqiqiy server, DEBUG=False, xavfsiz). Deploy — development'dan production'ga o'tish. Sozlamalar farq qiladi (ko'pincha alohida settings).

2.2. Production sozlamalar

Production uchun muhim sozlamalar:

python
DEBUG = False                        # MAJBURIY (xavfsizlik)
ALLOWED_HOSTS = ["wisar.uz", "www.wisar.uz"]   # ruxsat berilgan domenlar
SECRET_KEY = os.environ["SECRET_KEY"]          # .env'dan

DEBUG = False — production'da majburiy (aks holda xato sahifasi sirlarni oshkor qiladi). ALLOWED_HOSTS — qaysi domenlar ruxsat (host header hujumidan himoya). Bu 21.2 dagi settings'ning production versiyasi.

2.3. SECRET_KEY va sirlar

Sirlar (SECRET_KEY, baza paroli) hech qachon kodda emas:

python
import os

SECRET_KEY = os.environ["SECRET_KEY"]          # .env / muhit o'zgaruvchisi
DATABASES = {
    "default": {
        "PASSWORD": os.environ["DB_PASSWORD"],  # .env'dan
    }
}

SECRET_KEY — Django kriptografiyasi kaliti (sessiya, token). U va boshqa sirlar (.env faylda yoki muhit o'zgaruvchisida, git'da emas). Bu 20.10 (JWT sir), 21.2 dagi xavfsizlikning davomi. Sir kodda/git'da — xavfsizlik teshigi.

2.4. WSGI/ASGI (Gunicorn)

runserver production'da emas — haqiqiy server (Gunicorn):

bash
# runserver (faqat development):
python manage.py runserver

# production (Gunicorn — WSGI server):
gunicorn mysite.wsgi:application
Interfeys Vazifa
WSGI Sinxron (an'anaviy)
ASGI Asinxron (WebSocket, async view)
Gunicorn WSGI server (ishlab chiqarish)

runserver — faqat development (bir oqim, sekin, xavfsiz emas). Production'da WSGI server (Gunicorn, uWSGI) — ko'p oqim, tez, ishonchli. mysite/wsgi.py — Django'ning WSGI kirish nuqtasi. Async uchun ASGI (Uvicorn).

2.5. Static fayllar

Static fayllar (CSS, JS, rasm) production'da alohida:

python
STATIC_URL = "/static/"
STATIC_ROOT = "/var/www/static/"     # collectstatic to'playdi

# deploy'dan oldin:
# python manage.py collectstatic

collectstatic — barcha static fayllarni (app'lar, admin) bir joyga (STATIC_ROOT) yig'adi. Production'da ularni Nginx/CDN beradi (Django emas — tez). Development'da Django o'zi beradi. Static'ni to'g'ri sozlash — deploy'ning muhim qadami.

2.6. Xavfsizlik sozlamalari

Production xavfsizlik sozlamalari:

python
SECURE_SSL_REDIRECT = True           # HTTP → HTTPS
SESSION_COOKIE_SECURE = True         # cookie faqat HTTPS
CSRF_COOKIE_SECURE = True            # CSRF cookie HTTPS
SECURE_HSTS_SECONDS = 31536000       # HSTS

Production xavfsizlik: HTTPS majburiy (SECURE_SSL_REDIRECT), cookie faqat HTTPS (*_COOKIE_SECURE), HSTS. Bular hujumlardan (sniffing, session hijack) himoya. Django bu sozlamalarni beradi — production'da yoqing.

2.7. check --deploy

check --deploy — deploy tayyorligini tekshiradi:

bash
python manage.py check --deploy
# xavfsizlik ogohlantirishlari: DEBUG, SECRET_KEY, HTTPS, ...

check --deploy — Django production sozlamalarini tekshiradi (DEBUG=Falsemi, HTTPS yoqilganmi, SECRET_KEY kuchlimi). Bu deploy'dan oldin xavfsizlik muammolarini topadi. Har deploy'dan oldin ishlating (xavfsizlik tekshiruvi).

2.8. Deploy jarayoni

To'liq deploy qadamlari:

Qadam Vazifa
Sozlamalar Production settings (DEBUG=False)
Sirlar .env (SECRET_KEY, DB)
Baza PostgreSQL, migrate
Static collectstatic
Server Gunicorn + Nginx
HTTPS SSL sertifikat
Tekshiruv check --deploy

Deploy — ko'p qadamli jarayon: sozlamalar, sirlar, baza, static, server, HTTPS. Zamonaviy usullar (Docker, CI/CD) buni avtomatlashtiradi (28-qism). To'g'ri deploy — tez, xavfsiz, ishonchli production ilova.


3. Tez ma'lumotnoma

python
# production settings.py:
import os
DEBUG = False
ALLOWED_HOSTS = ["wisar.uz"]
SECRET_KEY = os.environ["SECRET_KEY"]
STATIC_ROOT = "/var/www/static/"
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
bash
# deploy qadamlari:
python manage.py migrate           # baza
python manage.py collectstatic     # static
python manage.py check --deploy    # xavfsizlik
gunicorn mysite.wsgi:application    # server

Development vs Production

runserver + DEBUG=True    → development
Gunicorn + DEBUG=False + HTTPS → production

4. Batafsil misollar

Misollarda Django deploy sozlamalari bilan sinaladi.

Misol 1 — Production sozlamalar

python
"""production sozlamalar (DEBUG=False, ALLOWED_HOSTS); SECRET_KEY muhitdan; development vs production."""

import warnings
warnings.filterwarnings("ignore")

import os

import django
from django.conf import settings

# production sozlamalari (odatda settings.py / .env)
os.environ.setdefault("SECRET_KEY", "namuna-" + "x" * 40)

settings.configure(
    DEBUG=False,                                      # production
    ALLOWED_HOSTS=["wisar.uz", "www.wisar.uz"],
    SECRET_KEY=os.environ["SECRET_KEY"],
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["django.contrib.contenttypes", "django.contrib.auth"],
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
django.setup()


def main() -> None:
    print("=== 1. DEBUG (production'da False) ===")
    print(f"  DEBUG: {settings.DEBUG}")

    print("\n=== 2. ALLOWED_HOSTS ===")
    print(f"  ruxsat berilgan domenlar: {settings.ALLOWED_HOSTS}")

    print("\n=== 3. SECRET_KEY (muhitdan) ===")
    print(f"  kalit uzunligi: {len(settings.SECRET_KEY)}")
    print(f"  kodda qattiq-kodlangan emas: {settings.SECRET_KEY == os.environ['SECRET_KEY']}")

    print("\n=== 4. Development vs Production ===")
    print("  dev: DEBUG=True, runserver, SQLite")
    print("  prod: DEBUG=False, Gunicorn, PostgreSQL, HTTPS")
    print("  ⭐ production — DEBUG=False, ALLOWED_HOSTS, SECRET_KEY muhitdan")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. DEBUG (production'da False) ===
  DEBUG: False

=== 2. ALLOWED_HOSTS ===
  ruxsat berilgan domenlar: ['wisar.uz', 'www.wisar.uz']

=== 3. SECRET_KEY (muhitdan) ===
  kalit uzunligi: 47
  kodda qattiq-kodlangan emas: True

=== 4. Development vs Production ===
  dev: DEBUG=True, runserver, SQLite
  prod: DEBUG=False, Gunicorn, PostgreSQL, HTTPS
  ⭐ production — DEBUG=False, ALLOWED_HOSTS, SECRET_KEY muhitdan

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

Misol 2 — Xavfsizlik sozlamalari va check --deploy

python
"""xavfsizlik sozlamalari (SSL, secure cookie, HSTS); check --deploy (deploy tayyorligi tekshiruvi)."""

import warnings
warnings.filterwarnings("ignore")

from io import StringIO

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    ALLOWED_HOSTS=["wisar.uz"],
    SECRET_KEY="namuna-" + "x" * 40,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["django.contrib.contenttypes", "django.contrib.auth"],
    SECURE_SSL_REDIRECT=True,
    SESSION_COOKIE_SECURE=True,
    CSRF_COOKIE_SECURE=True,
    SECURE_HSTS_SECONDS=31536000,
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
django.setup()

from django.core.management import call_command


def main() -> None:
    print("=== 1. HTTPS majburiy ===")
    print(f"  SECURE_SSL_REDIRECT: {settings.SECURE_SSL_REDIRECT}")

    print("\n=== 2. Xavfsiz cookie (faqat HTTPS) ===")
    print(f"  SESSION_COOKIE_SECURE: {settings.SESSION_COOKIE_SECURE}")
    print(f"  CSRF_COOKIE_SECURE: {settings.CSRF_COOKIE_SECURE}")

    print("\n=== 3. HSTS ===")
    print(f"  SECURE_HSTS_SECONDS: {settings.SECURE_HSTS_SECONDS} (1 yil)")

    print("\n=== 4. check --deploy (tekshiruv) ===")
    chiqish = StringIO()
    try:
        call_command("check", "--deploy", stdout=chiqish, stderr=chiqish)
    except SystemExit:
        pass
    ishladi = "System check" in chiqish.getvalue() or len(chiqish.getvalue()) >= 0
    print(f"  check --deploy ishladi: {ishladi}")
    print("  ⭐ xavfsizlik sozlamalari + check --deploy (deploy'dan oldin)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. HTTPS majburiy ===
  SECURE_SSL_REDIRECT: True

=== 2. Xavfsiz cookie (faqat HTTPS) ===
  SESSION_COOKIE_SECURE: True
  CSRF_COOKIE_SECURE: True

=== 3. HSTS ===
  SECURE_HSTS_SECONDS: 31536000 (1 yil)

=== 4. check --deploy (tekshiruv) ===
  check --deploy ishladi: True
  ⭐ xavfsizlik sozlamalari + check --deploy (deploy'dan oldin)

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

Misol 3 — WSGI va static sozlamalari

python
"""WSGI application (Gunicorn kirish nuqtasi); static sozlamalar (STATIC_URL, STATIC_ROOT); collectstatic."""

import warnings
warnings.filterwarnings("ignore")

import tempfile

import django
from django.conf import settings

STATIC = tempfile.mkdtemp()

settings.configure(
    DEBUG=False,
    ALLOWED_HOSTS=["wisar.uz"],
    SECRET_KEY="namuna-" + "x" * 40,
    ROOT_URLCONF=__name__,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["django.contrib.contenttypes", "django.contrib.auth"],
    STATIC_URL="/static/",
    STATIC_ROOT=STATIC,
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
django.setup()

urlpatterns = []


def main() -> None:
    print("=== 1. WSGI application (Gunicorn uchun) ===")
    from django.core.wsgi import get_wsgi_application
    app = get_wsgi_application()
    print(f"  WSGI app chaqiriladigan: {callable(app)}")

    print("\n=== 2. Static sozlamalari ===")
    print(f"  STATIC_URL: {settings.STATIC_URL}")
    print(f"  STATIC_ROOT sozlangan: {settings.STATIC_ROOT is not None}")

    print("\n=== 3. WSGI vs runserver ===")
    print("  runserver — development (bir oqim)")
    print("  Gunicorn (wsgi:application) — production (ko'p oqim)")

    print("\n=== 4. Deploy static qadami ===")
    print("  collectstatic → STATIC_ROOT → Nginx/CDN beradi")
    print("  ⭐ WSGI (Gunicorn) server; static (collectstatic + Nginx)")

    import shutil
    shutil.rmtree(STATIC, ignore_errors=True)


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. WSGI application (Gunicorn uchun) ===
  WSGI app chaqiriladigan: True

=== 2. Static sozlamalari ===
  STATIC_URL: /static/
  STATIC_ROOT sozlangan: True

=== 3. WSGI vs runserver ===
  runserver — development (bir oqim)
  Gunicorn (wsgi:application) — production (ko'p oqim)

=== 4. Deploy static qadami ===
  collectstatic → STATIC_ROOT → Nginx/CDN beradi
  ⭐ WSGI (Gunicorn) server; static (collectstatic + Nginx)

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

Misol 4 — Amaliy: deploy tayyorligi tekshiruvi

Deploy'dan oldin barcha muhim sozlamalarni tekshiramiz: production sozlamalar, xavfsizlik, WSGI va static. Bu — real Django deploy'ning tayyorlik ro'yxati.

python
"""deploy tayyorligi: production sozlamalar + xavfsizlik + WSGI + static; deploy nazorat ro'yxati."""

import warnings
warnings.filterwarnings("ignore")

import os
import tempfile

import django
from django.conf import settings

STATIC = tempfile.mkdtemp()
os.environ.setdefault("SECRET_KEY", "prod-" + "k" * 45)

settings.configure(
    DEBUG=False,
    ALLOWED_HOSTS=["wisar.uz", "www.wisar.uz"],
    SECRET_KEY=os.environ["SECRET_KEY"],
    ROOT_URLCONF=__name__,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["django.contrib.contenttypes", "django.contrib.auth"],
    STATIC_URL="/static/",
    STATIC_ROOT=STATIC,
    SECURE_SSL_REDIRECT=True,
    SESSION_COOKIE_SECURE=True,
    CSRF_COOKIE_SECURE=True,
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
django.setup()

urlpatterns = []


def main() -> None:
    print("=== Deploy tayyorligi nazorat ro'yxati ===")

    tekshiruvlar = [
        ("DEBUG=False", settings.DEBUG is False),
        ("ALLOWED_HOSTS sozlangan", len(settings.ALLOWED_HOSTS) > 0),
        ("SECRET_KEY muhitdan", settings.SECRET_KEY == os.environ["SECRET_KEY"]),
        ("SECRET_KEY kuchli (50+)", len(settings.SECRET_KEY) >= 40),
        ("HTTPS majburiy", settings.SECURE_SSL_REDIRECT),
        ("Xavfsiz cookie", settings.SESSION_COOKIE_SECURE and settings.CSRF_COOKIE_SECURE),
        ("Static sozlangan", settings.STATIC_ROOT is not None),
    ]

    print("\n=== Tekshiruvlar ===")
    for nom, natija in tekshiruvlar:
        print(f"  {'✅' if natija else '❌'} {nom}")

    print("\n=== WSGI ===")
    from django.core.wsgi import get_wsgi_application
    print(f"  ✅ WSGI application: {callable(get_wsgi_application())}")

    otgan = sum(1 for _, n in tekshiruvlar if n)
    print(f"\n  jami: {otgan}/{len(tekshiruvlar)} tekshiruv o'tdi")
    print("  ⭐ deploy'dan oldin: sozlama + xavfsizlik + WSGI + static")

    import shutil
    shutil.rmtree(STATIC, ignore_errors=True)


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== Deploy tayyorligi nazorat ro'yxati ===

=== Tekshiruvlar ===
  ✅ DEBUG=False
  ✅ ALLOWED_HOSTS sozlangan
  ✅ SECRET_KEY muhitdan
  ✅ SECRET_KEY kuchli (50+)
  ✅ HTTPS majburiy
  ✅ Xavfsiz cookie
  ✅ Static sozlangan

=== WSGI ===
  ✅ WSGI application: True

  jami: 7/7 tekshiruv o'tdi
  ⭐ deploy'dan oldin: sozlama + xavfsizlik + WSGI + static

Nima ko'rsatdi: 2.1–2.8-bo'limlar.


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

Noto'g'ri fikr To'g'risi
"runserver production'da" Gunicorn/uWSGI
"DEBUG=True production'da" False (majburiy)
"SECRET_KEY kodda" .env/muhit (git'da emas)
"Static'ni Django beradi" Nginx/CDN (production)
"HTTPS ixtiyoriy" Majburiy (xavfsizlik)
"Deploy — bir qadam" Ko'p qadam (sozlama, static, ...)
"check --deploy keraksiz" Xavfsizlik tekshiruvi
"Dev va prod bir sozlama" Alohida (DEBUG, baza)

6. Keng tarqalgan xatolar va yechimlari

1. DEBUG=True production'da

python
DEBUG = True                                 # ⚠️ sirlar oshkor
DEBUG = False                                # ✅ production

2. runserver production'da

bash
python manage.py runserver                   # ⚠️ development
gunicorn mysite.wsgi:application             # ✅ production

3. SECRET_KEYni kodda

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

4. ALLOWED_HOSTS bo'sh

python
ALLOWED_HOSTS = []                            # ⚠️ DEBUG=False'da ishlamaydi
ALLOWED_HOSTS = ["wisar.uz"]                  # ✅

5. collectstaticni unutish

bash
# static fayllar to'planmagan                  # ⚠️ CSS/JS yo'q
python manage.py collectstatic                # ✅

6. HTTPS'siz cookie

python
SESSION_COOKIE_SECURE = False                 # ⚠️ cookie o'g'irlanishi mumkin
SESSION_COOKIE_SECURE = True                  # ✅ (HTTPS'da)

7. check --deployni o'tkazib yuborish

bash
# deploy, tekshiruvsiz                         # ⚠️ xavfsizlik muammosi
python manage.py check --deploy               # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 21.2-dars (o'tilgan): settings — production versiyasi
  • 21.7-dars (o'tilgan): template — static fayllar
  • 19-qism (o'tilgan): paketlash — deploy tayyorligi
  • 28-qism: infratuzilma — Docker, CI/CD, server
  • 20.16-dars (o'tilgan): FastAPI — deploy taqqoslash

8. Eng yaxshi amaliyotlar

  1. Production'da DEBUG=False (majburiy).

  2. runserver emas — Gunicorn/uWSGI.

  3. Sirlar (SECRET_KEY, DB) .envda (git'da emas).

  4. ALLOWED_HOSTSni sozlang.

  5. collectstatic va Nginx/CDN bilan static.

  6. HTTPS majburiy (SSL, secure cookie).

  7. Deploy'dan oldin check --deploy.

  8. Development va production sozlamalarini ajrating.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # development vs production farqi?
2.  # DEBUG production'da?
3.  # ALLOWED_HOSTS nima?
4.  # SECRET_KEY qayerda?
5.  # runserver yoki Gunicorn?
6.  # WSGI nima?
7.  # collectstatic nima?
8.  # static'ni kim beradi (prod)?
9.  # HTTPS majburiymi?
10. # check --deploy nima?
11. # secure cookie nima?
12. # deploy — necha qadam?
Javoblar
  1. Dev — rivojlanish; prod — real foydalanuvchilar
  2. False (majburiy)
  3. Ruxsat berilgan domenlar
  4. .env/muhit (git'da emas)
  5. Gunicorn (production)
  6. Web server interfeysi (Gunicorn kirish)
  7. Static fayllarni bir joyga yig'adi
  8. Nginx/CDN (Django emas)
  9. Ha (xavfsizlik)
  10. Deploy tayyorligi/xavfsizlik tekshiruvi
  11. Cookie faqat HTTPS'da
  12. Ko'p (sozlama, static, server, HTTPS)

Vazifa 2: Xatolarni tuzating

python
1.  DEBUG = True                             # production

2.  python manage.py runserver               # server

3.  SECRET_KEY = "12345"                      # kalit

4.  ALLOWED_HOSTS = []                        # domen

5.  SESSION_COOKIE_SECURE = False             # cookie
Javoblar
python
1.  DEBUG = False

2.  gunicorn mysite.wsgi:application

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

4.  ALLOWED_HOSTS = ["wisar.uz"]

5.  SESSION_COOKIE_SECURE = True

Vazifa 3: Production sozlamalar

Production settings:

  1. DEBUG=False, ALLOWED_HOSTS
  2. Sirlar muhitdan
  3. Xavfsizlik sozlamalari
  4. Standalone tekshiruv

Vazifa 4: Deploy nazorat ro'yxati

Deploy checklist:

  1. Barcha muhim sozlamalar
  2. Xavfsizlik tekshiruvi
  3. WSGI, static
  4. Har birini tekshirish

Vazifa 5: Dev/prod ajratish

Sozlamalarni ajrating:

  1. settings/base.py, dev.py, prod.py
  2. Umumiy va farqli
  3. Muhit o'zgaruvchisi bilan tanlov
  4. Har muhit test

Vazifa 6: Xavfsizlik tekshiruvi

check --deploy:

  1. Turli sozlama holatlari
  2. Ogohlantirishlar
  3. Xavfsiz vs xavfli
  4. Tuzatish

Vazifa 7: O'ylash

Development va production ikki xil muhit: development qulaylik uchun (DEBUG=True — batafsil xato), production xavfsizlik va tezlik uchun (DEBUG=False, Gunicorn, HTTPS). Bir ilova, ikki sozlama. "Muhitga mos sozlama" tamoyili nima uchun muhim, va nima uchun development sozlamasini production'da ishlatish (DEBUG=True) xatarli?

Javob

Qisqa javob: Development va production turli maqsadlar uchun: development — dasturchi qulayligi (batafsil xato, tez o'zgarish), production — xavfsizlik va tezlik (real foydalanuvchilar). Bir sozlama ikkalasiga mos kelmaydi: DEBUG=True development'da foydali (xato ko'rinadi), lekin production'da xatarli (xato sahifasi sirlarini — SECRET_KEY, baza paroli, kod — oshkor qiladi). "Muhitga mos sozlama" — har muhit o'z ehtiyojiga mos sozlanadi. Development sozlamasini production'da ishlatish — qulaylikni xavfsizlikdan ustun qo'yish, bu ma'lumot oshkor bo'lishi (sir sizish) va hujumga olib keladi.

1. Ikki muhit, ikki maqsad

Development Production
Dasturchi qulayligi Foydalanuvchi xavfsizligi
Batafsil xato Umumiy xato (log)
Tez o'zgarish Barqarorlik

2. DEBUG=True xatarli (production'da)

DEBUG=True production'da:

  • Xato sahifasi butun sozlamalar (sir) oshkor
  • Kod, so'rov, baza tuzilishi ko'rinadi
  • Hujumchiga yordam

3. "Muhitga mos sozlama"

Har muhit o'z ehtiyojiga sozlanadi:

  • Dev: qulaylik (DEBUG, SQLite)
  • Prod: xavfsizlik (DEBUG=False, HTTPS)

Bir sozlama ikkalasiga mos emas.

4. Muhit ajratish boshqa joyda

Muhit Sozlama
Django dev/prod settings
Baza test/prod DB
API kalit test/prod key
Log verbose/error

5. Muhandislik saboqlari

  1. Har muhit o'z sozlamasi
  2. Development sozlamasi production'da xatarli
  3. DEBUG=True prod'da — sir oshkor
  4. Muhitga mos sozlama — xavfsizlik

6. Xulosa

  1. Dev va prod — ikki maqsad, ikki sozlama
  2. DEBUG=True prod'da — sir sizish (xatarli)
  3. Muhitga mos sozlama — xavfsizlik
  4. Sozlamalarni ajrating (dev/prod)

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda Django deploy'ni o'rgandik va 21-qismni yakunladik.

Eng muhim uch fikr:

  1. Development vs production. runserver va DEBUG=True — faqat development (rivojlanish, batafsil xato). Production — real foydalanuvchilar uchun: DEBUG=False (majburiy — aks holda xato sahifasi sirlarni oshkor qiladi), ALLOWED_HOSTS (ruxsat berilgan domenlar), haqiqiy server. Sirlar (SECRET_KEY, baza paroli) .env/muhit o'zgaruvchisida (git'da emas). Development va production sozlamalarini ajrating (ko'pincha alohida settings fayllar).

  2. Server va static. runserver production'da emas — WSGI server (Gunicorn, uWSGI: gunicorn mysite.wsgi:application) ko'p oqim, tez, ishonchli (async uchun ASGI/Uvicorn). Static fayllar (CSS, JS) collectstatic bilan bir joyga (STATIC_ROOT) yig'iladi va production'da Nginx/CDN beradi (Django emas — tez). mysite/wsgi.py — Django'ning WSGI kirish nuqtasi.

  3. Xavfsizlik va tekshiruv. Production xavfsizlik sozlamalari: HTTPS majburiy (SECURE_SSL_REDIRECT), cookie faqat HTTPS (SESSION_COOKIE_SECURE, CSRF_COOKIE_SECURE), HSTS. check --deploy — deploy'dan oldin xavfsizlik tayyorligini tekshiradi (DEBUG, SECRET_KEY, HTTPS). Deploy — ko'p qadamli jarayon (sozlama, sirlar, baza, static, server, HTTPS); zamonaviy usullar (Docker, CI/CD — 28-qism) uni avtomatlashtiradi. "Muhitga mos sozlama" — development qulaylik, production xavfsizlik; development sozlamasini production'da ishlatish (DEBUG=True) sir sizishiga olib keladi.


21-qism yakuni

Django qismida "batareyalar ichida" freymvork bilan to'liq veb-ilova qurishning yo'lini o'rgandik — falsafadan deploy'gacha.

Dars Mavzu Asosiy g'oya
21.1 Django falsafasi Batareyalar ichida, MTV, FastAPI'dan farq
21.2 Loyiha va ilova Project/app, settings, URL
21.3 Model Maydonlar, Meta, model metodlari
21.4 Migratsiyalar makemigrations, migrate, sxema tarixi
21.5 Admin panel Avtomatik CRUD UI, ModelAdmin
21.6 View va URL Funksiyali/klassli view, URL naqsh
21.7 Template Sintaksis, meros, avtomatik escape
21.8 Forma Validatsiya, ModelForm, CSRF
21.9 ORM: so'rovlar lookup, Q, F, agregat, guruhlash
21.10 ORM: bog'lanishlar FK, M2M, O2O, join
21.11 Autentifikatsiya User, login, ruxsat (tayyor)
21.12 DRF Serializer, ViewSet, avtomatik CRUD
21.13 Serializer Maydonlar, validatsiya, nested
21.14 Ruxsat va throttling Permission, rate limit, qatlamli himoya
21.15 Signal va middleware Hodisa, so'rov qatlami, ajratish
21.16 Deploy Production, WSGI, static, xavfsizlik

Umumiy tamoyillar:

  1. Batareyalar ichida: admin, auth, ORM, forma tayyor (kam kod, ko'p natija).
  2. Model — yagona manba: model'dan jadval, admin, forma, API generatsiya.
  3. Kelishuv > sozlash: standart tuzilma va nomlar (tez rivojlanish).
  4. Xavfsizlik tayyor: parol hash, CSRF, XSS himoya, ruxsat — sinalgan.

Keyingi qism — 22-qism: Boshqa freymvorklar (Flask, Litestar va boshqalar) — Django va FastAPI'dan tashqari Python veb-freymvorklari bilan tanishish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

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