İstifadəçi brauzerdə hər hansı bir veb-ünvanı açdıqda və ya mobil tətbiq serverə sorğu göndərdikdə arxa planda ardıcıl şəbəkə prosesləri baş verir. HTTP protokolunun və müştəri–server (Client–Server) modelinin necə işlədiyini dərindən anlamaq Python ilə peşəkar backend proqramlaşdırmanın və Django freymvorkunun əsas təməlidir.
1. Müştəri–server modeli, URL və DNS
Müasir veb-tətbiqlər klassik müştəri–server arxitekturası üzərində qurulur:
- Müştəri (Client): Sorğunu başladan tərəfdir (veb-brauzer, mobil tətbiq,
curlterminal aləti və ya digər mikroxidmət). Müştəri HTTP sorğusunu formalaşdırır və serverdən cavab gözləyir. - Server (Server): Fasiləsiz işləyən, şəbəkə portlarını dinləyən, biznes məntiqini icra edən və cavab qaytaran uzaq kompüter və ya proqram prosesidir.
[ Müştəri (Brauzer / cURL) ] ─── HTTP Request ───► [ Server (Django / WSGI) ]
[ ] ◄─── HTTP Response ─── [ ]Ünvan necə əlaqəyə çevrilir: URL və DNS
İstifadəçi brauzerə https://kurslar.prowid.com:443/courses/django/?ref=top#reviews ünvanını daxil etdikdə:
- Protokol sxemi (
https://): Məlumatın ötürülmə qaydasını bildirir (TLS ilə şifrələnmiş təhlükəsiz HTTP). - Host / Domen adı (
kurslar.prowid.com): İnsan tərəfindən oxuna bilən simvolik ad. - DNS təyini (Domain Name System): Əməliyyat sistemi DNS serverinə müraciət edərək domen adını real IP ünvanına (məsələn,
185.199.108.153) çevirir. - Port (
:443HTTPS üçün,:80adi HTTP üçün): Serverdə işləyən konkret tətbiqin şəbəkə qapısı. - Resurs yolu (
/courses/django/): Veb-tətbiqdə hansı səhifənin və ya API nöqtəsinin istənildiyini müəyyən edən yol. - Query parametrləri (
?ref=top): Əlavə filtrləri və ya parametrləriaçar=dəyərformatında ötürən sorğu sətri. - Fraqment / Lövbər (
#reviews): Səhifə daxilindəki konkret bloka keçid üçündür (yalnız brauzerdə icra olunur, serverə heç vaxt göndərilmir).
2. HTTP sorğusu və cavabının strukturu
HTTP (HyperText Transfer Protocol) — etibarlı TCP protokolu üzərində işləyən tətbiqi səviyyəli mətn protokoludur.
HTTP sorğusunun strukturu (HTTP Request)
HTTP sorğusu dörd əsas hissədən ibarətdir:
- Başlanğıc sətri (Request Line): HTTP metodu, resurs yolu və protokol versiyası.
- Başlıqlar (Headers):
Açar: Dəyərformatında meta-məlumatlar (qəbul edilən məlumat növü, autentifikasiya, cookie-lər). - Boş ayırıcı sətir (
\r\n). - Sorğunun gövdəsi (Body / Payload): Serverə məlumat göndərildikdə ötürülən məzmun (JSON, forma məlumatları, fayllar).
POST /api/v1/articles/ HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Accept: application/json
Content-Length: 54
{"title": "Intro to Django", "published": true}Əsas HTTP metodları
| Metod | Təyinatı | İdempotentlik | Gövdə (Body) |
|---|---|---|---|
GET | Məlumatı oxumaq (server vəziyyətini dəyişmir) | Bəli | Yox |
POST | Yeni resurs yaratmaq və ya əməliyyat icra etmək | Xeyr | Bəli |
PUT | Mövcud resursu tamamilə əvəz etmək | Bəli | Bəli |
PATCH | Resursun sahələrini qismən yeniləmək | Xeyr | Bəli |
DELETE | Resursu silmək | Bəli | Nadir hallarda |
HEAD | Yalnız başlıqları almaq (gövdəsiz) | Bəli | Yox |
OPTIONS | Serverin dəstəklədiyi metodları yoxlamaq (CORS) | Bəli | Yox |
📌 İdempotentlik: Eyni sorğunun eyni parametrlərlə bir və ya bir neçə dəfə ardıcıl icra edilməsi serverdə eyni nəticəni doğurursa, bu metod idempotent hesab olunur.
HTTP cavabının strukturu (HTTP Response)
Serverin qaytardığı cavabın strukturu:
- Status sətri (Status Line): Protokol versiyası, ədədi status kodu və izahat mətni.
- Cavab başlıqları (Response Headers): Məzmun növü, ölçüsü, server tarixi, keş siyasətləri və cookie-lər.
- Boş ayırıcı sətir.
- Cavabın gövdəsi (Response Body): HTML səhifə, JSON obyekti və ya binar fayl.
HTTP/1.1 200 OK
Date: Wed, 30 Sep 2026 07:00:00 GMT
Server: WSGIServer/0.2 CPython/3.13.1
Content-Type: text/html; charset=utf-8
Content-Length: 124
<!DOCTYPE html>
<html>
<head><title>Django Kursu</title></head>
<body><h1>Django-ya xoş gəlmisiniz!</h1></body>
</html>HTTP status kodlarının sinifləri
1xx(Məlumatlandırıcı): Sorğu qəbul edilib, proses davam edir (101 Switching Protocols).2xx(Uğurlu):200 OK— Standart uğurlu cavab.201 Created— Yeni resurs uğurla yaradıldı (POSTsorğularına cavab olaraq).204 No Content— Əməliyyat uğurla tamamlandı, lakin cavabın gövdəsi boşdur (DELETEüçün xarakterikdir).3xx(Yönləndirmə):301 Moved Permanently— Daimi yönləndirmə (brauzerlər tərəfindən keşlənir).302 Found(və ya303 See Other/307 Temporary Redirect) — Müvəqqəti yönləndirmə (Django-daredirect()funksiyası susmaya görə 302 qaytarır).4xx(Müştəri xətaları):400 Bad Request— Sintaksis xətası və ya düzgün olmayan daxiletmə məlumatı.401 Unauthorized— Autentifikasiya tələb olunur (istifadəçi daxil olmayıb).403 Forbidden— Giriş qadağandır (istifadəçinin bu əməliyyata hüququ çatmır).404 Not Found— Tələb olunan URL serverdə tapılmadı.405 Method Not Allowed— HTTP metodu bu endpoint üçün dəstəklənmir.422 Unprocessable Entity— Semantik validasiya xətası (FastAPI-də geniş istifadə olunur).5xx(Server xətaları):500 Internal Server Error— Python kodunda tutulmamış kritik xəta.502 Bad Gateway— Proksi server (Nginx) arxadakı backend tətbiqi ilə əlaqə qura bilmədi.503 Service Unavailable— Server həddən artıq yüklənib və ya texniki baxışdadır.504 Gateway Timeout— Backend tətbiqi sorğunu vaxtında cavablandırmadı.
3. Real HTTP mübadiləsinin curl -v ilə izlənməsi
Terminalda curl əmrini -v (verbose) parametri ilə icra edərək müştəri ilə server arasındakı canlı məlumat mübadiləsini izləmək mümkündür:
curl -v -X POST "http://127.0.0.1:8000/api/feedback/" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"email": "student@example.com", "score": 5}'Terminal çıxışı real bağlantını aydın göstərir:
* Trying 127.0.0.1:8000...
* Connected to 127.0.0.1 (127.0.0.1) port 8000
> POST /api/feedback/ HTTP/1.1
> Host: 127.0.0.1:8000
> User-Agent: curl/8.7.1
> Content-Type: application/json
> Accept: application/json
> Content-Length: 44
>
* upload completely sent off: 44 bytes
< HTTP/1.1 201 Created
< Date: Wed, 30 Sep 2026 07:05:00 GMT
< Server: WSGIServer/0.2 CPython/3.13.1
< Content-Type: application/json
< Content-Length: 35
<
{"status":"ok","id":42,"saved":true}
* Connection #0 to host 127.0.0.1 left intact4. WSGI nədir və nə üçün freymvork lazımdır?
Python mühitində veb-server (Gunicorn, uWSGI və s.) ilə tətbiq kodu arasındakı qarşılıqlı əlaqə PEP 3333 — WSGI (Web Server Gateway Interface) standartı ilə tənzimlənir.
Heç bir freymvork olmadan ən sadə ilkin WSGI tətbiqi sadəcə çağırıla bilən bir funksiyadır:
# simple_wsgi_app.py
from urllib.parse import parse_qs
def application(environ, start_response):
"""
Aşağı səviyyəli WSGI giriş nöqtəsi.
environ: Sorğu başlıqları, metod və mühit dəyişənlərini saxlayan lüğət.
start_response: Status və başlıqları göndərən funksiya.
"""
method = environ.get('REQUEST_METHOD', 'GET')
path = environ.get('PATH_INFO', '/')
query_string = environ.get('QUERY_STRING', '')
query_params = parse_qs(query_string)
if path == '/':
status = '200 OK'
headers = [('Content-Type', 'text/html; charset=utf-8')]
body = b"<h1>Ana Sehife</h1><p>Saf WSGI tetbiqi</p>"
elif path == '/hello' and method == 'GET':
name = query_params.get('name', ['Qonaq'])[0]
status = '200 OK'
headers = [('Content-Type', 'text/plain; charset=utf-8')]
body = f"Salam, {name}!".encode('utf-8')
else:
status = '404 Not Found'
headers = [('Content-Type', 'text/plain; charset=utf-8')]
body = b"404 Sehife Tapilmadi"
start_response(status, headers)
return [body]Bu tətbiqi standart Python kitabxanası ilə işə salmaq olar:
# run_server.py
from wsgiref.simple_server import make_server
from simple_wsgi_app import application
if __name__ == '__main__':
server = make_server('127.0.0.1', 8000, application)
print("WSGI server http://127.0.0.1:8000 unvaninda ise salindi...")
server.serve_forever()Bu nümunəyə baxdıqda aydın olur ki, müasir veb-freymvork nə qədər böyük həcmdə texniki rutini avtomatlaşdırır:
- Marşrutlaşdırma (Routing): URL parametrlərinin dinamik çıxarılması və tiplərə çevrilməsi (
<int:id>,<slug:slug>). - Təhlükəsizlik: CSRF hücumlarından müdafiə, SQL inyeksiyalarının qarşısının alınması, XSS filtrləməsi.
- Formaların və faylların qəbulu: Məlumatların validasiyası, səhvlərin göstərilməsi və fayl yükləmələri.
- Verilənlər bazası (ORM): Əlaqələrin idarə edilməsi, tranzaksiyalar və avtomatik miqrasiyalar.
- Şablon mühərriki (Templates): Dinamik HTML render olunması, şablon varisliyi və avtomatik təhlükəsiz ekranlaşdırma.
- İstifadəçi idarəetməsi: Şifrələrin təhlükəsiz heşlənməsi, sessiyalar və icazələr sistemi.
5. Müasir Python veb-freymvorklarına ümumi baxış
- Django («Batteries Included»): Tam təchiz olunmuş monolit freymvork. Özündə ORM, miqrasiyalar, hazır admin paneli, formalar, təhlükəsizlik və autentifikasiya sistemini birləşdirir. Böyük korporativ portallar, xəbər və elektron ticarət saytları üçün idealdır.
- FastAPI: Müasir asinxron (ASGI) mikrofreymvork. Python tip annotasiyaları və Pydantic validasiyası əsasında işləyir, avtomatik OpenAPI sənədləşməsi yaradır. Yüksək sürətli REST API və mikroxidmətlər üçün ən populyar seçimdir.
- Flask: Minimalist mikrofreymvork. Yalnız əsas marşrutlaşdırma və Jinja2 şablon sistemini təqdim edir, verilənlər bazası və alətlərin seçimini proqramçının ixtiyarına buraxır.
6. Yeni başlayanların ən çox etdiyi xətalar
⚠️ Xəta 1: «Server sorğular arasında istifadəçinin vəziyyətini avtomatik xatırlayır».
HTTP protokolu stateless (vəziyyətsiz) protokoldur. Hər bir sorğu digərindən asılı olmayaraq müstəqil icra olunur. İstifadəçini tanımaq üçün cookie-lər, server sessiyaları və ya JWT tokenləri tətbiq edilir.
⚠️ Xəta 2: «GET və POST eynidir, sadəcə POST parametrləri ünvanda gizlədir».
GETyalnız məlumatı oxumaq üçündür və serverdə heç bir dəyişiklik yaratmamalıdır (safe & idempotent).GETsorğuları brauzer və proksilər tərəfindən keşlənir.POSTisə serverdə məlumat yaratmaq və ya dəyişmək üçündür və heç vaxtGETilə əvəz olunmamalıdır.
7. Xülasə
- Veb dünyası müştəri və server arasındakı HTTP Request ↔ HTTP Response dövriyyəsi üzərində qurulub.
- HTTP sorğusu metod, yol, başlıqlar və gövdədən ibarətdir; cavab isə status kodu, başlıqlar və nəticə gövdəsini qaytarır.
- WSGI standartı Python tətbiqini veb-serverə bağlayan körpüdür.
- Django freymvorku tərtibatçını rutin şəbəkə və təhlükəsizlik qayğılarından azad edir.
- Növbəti dərsdə Django-nun daxili arxitekturasını və MTV (Model-Template-View) modelini addım-addım araşdıracağıq.