Mundarija (23)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Development vs production
- 2.2. Production sozlamalar
- 2.3. SECRET_KEY va sirlar
- 2.4. WSGI/ASGI (Gunicorn)
- 2.5. Static fayllar
- 2.6. Xavfsizlik sozlamalari
- 2.7. check --deploy
- 2.8. Deploy jarayoni
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Production sozlamalar
- Misol 2 — Xavfsizlik sozlamalari va check --deploy
- Misol 3 — WSGI va static sozlamalari
- Misol 4 — Amaliy: deploy tayyorligi tekshiruvi
- 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-qism yakuni
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_KEYva 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:
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:
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):
# 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:
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:
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:
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
# 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# deploy qadamlari:
python manage.py migrate # baza
python manage.py collectstatic # static
python manage.py check --deploy # xavfsizlik
gunicorn mysite.wsgi:application # serverDevelopment vs Production
runserver + DEBUG=True → development
Gunicorn + DEBUG=False + HTTPS → production4. Batafsil misollar
Misollarda Django deploy sozlamalari bilan sinaladi.
Misol 1 — Production sozlamalar
"""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:
=== 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 muhitdanNima ko'rsatdi: 2.1, 2.2, 2.3-bo'limlar.
Misol 2 — Xavfsizlik sozlamalari va check --deploy
"""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:
=== 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
"""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:
=== 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.
"""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:
=== 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 + staticNima 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
DEBUG = True # ⚠️ sirlar oshkor
DEBUG = False # ✅ production2. runserver production'da
python manage.py runserver # ⚠️ development
gunicorn mysite.wsgi:application # ✅ production3. SECRET_KEYni kodda
SECRET_KEY = "12345..." # ⚠️ git'da
SECRET_KEY = os.environ["SECRET_KEY"] # ✅ .env4. ALLOWED_HOSTS bo'sh
ALLOWED_HOSTS = [] # ⚠️ DEBUG=False'da ishlamaydi
ALLOWED_HOSTS = ["wisar.uz"] # ✅5. collectstaticni unutish
# static fayllar to'planmagan # ⚠️ CSS/JS yo'q
python manage.py collectstatic # ✅6. HTTPS'siz cookie
SESSION_COOKIE_SECURE = False # ⚠️ cookie o'g'irlanishi mumkin
SESSION_COOKIE_SECURE = True # ✅ (HTTPS'da)7. check --deployni o'tkazib yuborish
# 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
Production'da
DEBUG=False(majburiy).runserveremas — Gunicorn/uWSGI.Sirlar (
SECRET_KEY, DB).envda (git'da emas).ALLOWED_HOSTSni sozlang.collectstaticva Nginx/CDN bilan static.HTTPS majburiy (SSL, secure cookie).
Deploy'dan oldin
check --deploy.Development va production sozlamalarini ajrating.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- Dev — rivojlanish; prod — real foydalanuvchilar
False(majburiy)- Ruxsat berilgan domenlar
.env/muhit (git'da emas)- Gunicorn (production)
- Web server interfeysi (Gunicorn kirish)
- Static fayllarni bir joyga yig'adi
- Nginx/CDN (Django emas)
- Ha (xavfsizlik)
- Deploy tayyorligi/xavfsizlik tekshiruvi
- Cookie faqat HTTPS'da
- Ko'p (sozlama, static, server, HTTPS)
Vazifa 2: Xatolarni tuzating
1. DEBUG = True # production
2. python manage.py runserver # server
3. SECRET_KEY = "12345" # kalit
4. ALLOWED_HOSTS = [] # domen
5. SESSION_COOKIE_SECURE = False # cookieJavoblar
1. DEBUG = False
2. gunicorn mysite.wsgi:application
3. SECRET_KEY = os.environ["SECRET_KEY"]
4. ALLOWED_HOSTS = ["wisar.uz"]
5. SESSION_COOKIE_SECURE = TrueVazifa 3: Production sozlamalar
Production settings:
DEBUG=False,ALLOWED_HOSTS- Sirlar muhitdan
- Xavfsizlik sozlamalari
- Standalone tekshiruv
Vazifa 4: Deploy nazorat ro'yxati
Deploy checklist:
- Barcha muhim sozlamalar
- Xavfsizlik tekshiruvi
- WSGI, static
- Har birini tekshirish
Vazifa 5: Dev/prod ajratish
Sozlamalarni ajrating:
settings/base.py,dev.py,prod.py- Umumiy va farqli
- Muhit o'zgaruvchisi bilan tanlov
- Har muhit test
Vazifa 6: Xavfsizlik tekshiruvi
check --deploy:
- Turli sozlama holatlari
- Ogohlantirishlar
- Xavfsiz vs xavfli
- 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
- Har muhit o'z sozlamasi
- Development sozlamasi production'da xatarli
DEBUG=Trueprod'da — sir oshkor- Muhitga mos sozlama — xavfsizlik
6. Xulosa
- Dev va prod — ikki maqsad, ikki sozlama
DEBUG=Trueprod'da — sir sizish (xatarli)- Muhitga mos sozlama — xavfsizlik
- 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:
Development vs production.
runservervaDEBUG=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).Server va static.
runserverproduction'da emas — WSGI server (Gunicorn, uWSGI:gunicorn mysite.wsgi:application) ko'p oqim, tez, ishonchli (async uchun ASGI/Uvicorn). Static fayllar (CSS, JS)collectstaticbilan bir joyga (STATIC_ROOT) yig'iladi va production'da Nginx/CDN beradi (Django emas — tez).mysite/wsgi.py— Django'ning WSGI kirish nuqtasi.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:
- Batareyalar ichida: admin, auth, ORM, forma tayyor (kam kod, ko'p natija).
- Model — yagona manba: model'dan jadval, admin, forma, API generatsiya.
- Kelishuv > sozlash: standart tuzilma va nomlar (tez rivojlanish).
- 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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!