Django HTTP İstekleri: GET ve POST Arasındaki Farklar Nelerdir?

Web geliştirme dünyasına adım attığınızda, istemci (tarayıcınız) ile sunucu (Django uygulamanız) arasındaki iletişimin nasıl gerçekleştiğini anlamak çok önemlidir. Bu iletişim büyük ölçüde HTTP (Hypertext Transfer Protocol) üzerinden sağlanır. HTTP'nin sunduğu çeşitli metodlar olsa da, web uygulamalarında en sık karşılaştığımız iki kahraman GET ve POST metodlarıdır.


1. Temel Kavramlar: GET ve POST Nedir?

Bir web sayfasına girdiğinizde veya bir formu doldurup "Gönder" butonuna bastığınızda, tarayıcınız arka planda sunucuya bir "istek" (request) gönderir. Sunucu bu isteği işler ve bir "yanıt" (response) döndürür. Bu isteklerin amacı ve taşıdığı veri türü, kullanılan metoda (GET veya POST) göre değişir.

GET Metodu: "Bana Veriyi Getir"

  • Amacı: Sunucudan sadece veri okumak veya veri istemek için kullanılır.

  • Görünürlük: GET isteklerinde gönderilen parametreler URL'in sonuna eklenir (örneğin: ?aranan=django&sayfa=2). Bu nedenle tarayıcı geçmişinde ve sunucu loglarında görünür.

  • Güvenlik: URL'de açıkça göründüğü için şifre, kredi kartı gibi hassas veriler için kesinlikle kullanılmamalıdır.

  • Durum: Önbelleğe alınabilir (cache), yer imlerine eklenebilir (bookmark).

POST Metodu: "Bu Veriyi Al ve İşle"

  • Amacı: Sunucuya veri göndermek, sunucuda bir veri oluşturmak veya var olan bir veriyi değiştirmek için kullanılır (Kayıt olmak, giriş yapmak, ürün eklemek vb.).

  • Görünürlük: Veriler URL'de görünmez. İsteğin "gövdesi" (body) içine gizlenerek gönderilir.

  • Güvenlik: Veriler URL'de kabak gibi ortada olmadığı için hassas verileri taşımak için GET'e kıyasla çok daha güvenlidir (HTTPS ile birlikte kullanıldığında tam güvenlik sağlanır).

  • Durum: Önbelleğe alınmaz ve tarayıcı geçmişinde saklanmaz. Sayfayı yenilediğinizde "Formu yeniden göndermek istiyor musunuz?" uyarısı almanızın sebebi POST metodudur.


2. Django'da GET Metodu Kullanımı

Django'da görünümler (views), tarayıcıdan gelen request (istek) nesnesini ilk parametre olarak alır. Bu nesne, istekle ilgili tüm bilgileri barındırır.

Kullanıcının bir arama çubuğuna kelime yazıp arattığını düşünelim.

HTML Şablonu (search.html):

HTML:
<form method="GET" action="/arama/">
    <input type="text" name="sorgu" placeholder="Ne aramak istersiniz?">
    <button type="submit">Ara</button>
</form>

Kullanıcı "python" yazıp butona bastığında, tarayıcı şu URL'e gider: site.com/arama/?sorgu=python

Django View (views.py):

Python:
from django.shortcuts import render

def arama_gorunumu(request):
    # request.GET, URL'deki parametreleri bir sözlük (dictionary) gibi tutar.
    # 'sorgu' anahtarını ararız. Bulamazsa varsayılan olarak None döner.
    aranan_kelime = request.GET.get('sorgu')
    
    if aranan_kelime:
        mesaj = f"Arama sonucunuz: {aranan_kelime}"
        # Burada veritabanı filtreleme (örn: Model.objects.filter()) yapılabilir.
    else:
        mesaj = "Lütfen bir arama kelimesi girin."
        
    context = {'mesaj': mesaj}
    return render(request, 'search.html', context)

Önemli İpucu: request.GET['sorgu'] yerine request.GET.get('sorgu') kullanmak her zaman daha güvenlidir. Eğer URL'de 'sorgu' parametresi yoksa ilk yöntem MultiValueDictKeyError hatası fırlatırken, .get() yöntemi nazikçe None döndürür.


3. Django'da POST Metodu ve CSRF Koruması

POST metodu ile sunucuya veri gönderirken Django'nun çok önemli bir güvenlik önlemi devreye girer: CSRF (Cross Site Request Forgery) Koruması. Django, dışarıdan veya kötü niyetli sitelerden gelen sahte form gönderimlerini engellemek için her POST formuna özel bir güvenlik fişi (token) eklemenizi zorunlu kılar.

Şimdi bir kullanıcı iletişim formu oluşturalım.

HTML Şablonu (iletisim.html):

HTML:
<form method="POST" action="/iletisim/">
    {% csrf_token %} 
    
    <label for="isim">Adınız:</label>
    <input type="text" id="isim" name="isim_soyisim">
    
    <label for="mesaj">Mesajınız:</label>
    <textarea id="mesaj" name="kullanici_mesaji"></textarea>
    
    <button type="submit">Gönder</button>
</form>

Django View (views.py):

Python:
from django.shortcuts import render
from django.http import HttpResponse

def iletisim_gorunumu(request):
    # Gelen isteğin POST mu yoksa sayfayı ilk açış (GET) mi olduğunu kontrol ediyoruz
    if request.method == 'POST':
        # Kullanıcının forma girdiği verileri alıyoruz
        isim = request.POST.get('isim_soyisim')
        mesaj = request.POST.get('kullanici_mesaji')
        
        # Burada verileri veritabanına kaydedebilir veya e-posta atabilirsiniz.
        return HttpResponse(f"Teşekkürler {isim}, mesajın alındı!")
        
    # Eğer method POST değilse (yani kullanıcı sayfayı adres çubuğuna yazıp açtıysa)
    # sadece boş formu gösteriyoruz.
    return render(request, 'iletisim.html')

Bu yapıda (if request.method == 'POST':), aynı URL'i hem formu görüntülemek (GET) hem de form verilerini işlemek (POST) için kullanabiliriz. Bu, Django'da çok yaygın ve temiz bir kalıptır.


4. GET ve POST: Hızlı Karşılaştırma Tablosu

ÖzellikGET MetoduPOST Metodu
Temel İşlevVeri getirme/okumaVeri gönderme/yazma/güncelleme
Veri KonumuURL (Query String)HTTP İstek Gövdesi (Body)
GüvenlikDüşük (Şifreler URL'de görünür)Yüksek (Veriler gövdede taşınır)
Veri BoyutuSınırlı (Tarayıcı URL sınırına bağlı)Neredeyse Sınırsız (Büyük dosyalar yüklenebilir)
Tarayıcı GeçmişiKaydedilirKaydedilmez
Django'da Veri Almarequest.GET.get('anahtar')request.POST.get('anahtar')
CSRF TokenGerekmezZorunludur ({% csrf_token %})

Sonuç

Kısacası; veritabanında bir değişiklik yapmıyorsanız ve sadece bir içeriği süzmek veya görüntülemek istiyorsanız GET kullanın. Ancak sunucuya bir dosya yüklüyor, veritabanına yeni bir kayıt ekliyor veya bir şifre gönderiyorsanız kesinlikle POST metodunu tercih etmelisiniz.

Django, request nesnesi aracılığıyla her iki metodu da yönetmeyi oldukça basit ve güvenli hale getirir.

Django Forms (Form Sınıfları), HTML formlarını elle yazma, gelen verileri tek tek request.POST içinden çekme ve en önemlisi "Kullanıcı doğru veri girdi mi?" (Validation/Doğrulama) kontrollerini yapma yükünü omuzlarınızdan alır.

Önceki mesajımızdaki "İletişim Formu" örneğini, Django'nun form sınıfı olan forms.Form ile baştan yazalım.


1. Adım: Form Sınıfını Oluşturmak (forms.py)

Django uygulamanızın içinde (genellikle views.py ile aynı dizinde) bir forms.py dosyası oluştururuz ve formumuzun yapısını burada tanımlarız.

Python:
from django import forms

class IletisimFormu(forms.Form):
    # Form alanlarını ve kurallarını belirliyoruz
    isim_soyisim = forms.CharField(label='Adınız', max_length=100)
    
    # Textarea (çok satırlı metin kutusu) kullanmak için widget belirtiyoruz
    kullanici_mesaji = forms.CharField(label='Mesajınız', widget=forms.Textarea)

Burada alanların tiplerini (CharFieldEmailFieldIntegerField vb.) belirterek Django'ya veriyi nasıl doğrulaması gerektiğini söylemiş oluyoruz.

Django formlarında widget, bir form alanının (field) web sayfasında (HTML olarak) nasıl görüneceğini ve nasıl bir kullanıcı etkileşimi sunacağını belirleyen araçtır.

Kısaca özetlemek gerekirse: Django'da her form alanının (Field) bir veri tipi vardır ve her veri tipinin HTML'de varsayılan bir görünümü (Widget) bulunur. widget parametresi, bu varsayılan görünümü değiştirmek için kullanılır.

Verinin Nasıl Alınacağını Yönetir

Widget'lar sadece görseli değil, kullanıcının o HTML elementine girdiği verinin form tarafından nasıl okunacağını da yönetir. Bir <textarea> içindeki satır atlamaları, boşluklar vb. veriler bu widget sayesinde doğru bir şekilde Python koduna (views.py) aktarılır.

Özetle;

  • CharField: "Ben kullanıcının girdiği bir metin verisini (string) alacağım ve doğrulayacağım" der. (İşin veri/mantık kısmı).

  • widget=forms.Textarea: "Ben kullanıcının o metni rahatça yazabilmesi için ekrana büyük, çok satırlı bir kutu çizeceğim" der. (İşin görsel/kullanıcı arayüzü kısmı).


İpucu: Widget'ları kullanarak o metin kutusuna CSS class'ları (örneğin Bootstrap class'ları) veya kutunun boyutunu (satır/sütun sayısı) da ekleyebilirsin.


2. Adım: Görünümü (View) Güncellemek (views.py)

Şimdi en önemli kısma geliyoruz. GET ve POST metodlarını, oluşturduğumuz bu form sınıfı ile birlikte yöneteceğiz.

Python:
from django.shortcuts import render
from django.http import HttpResponse
from .forms import IletisimFormu

def iletisim_gorunumu(request):
    # 1. Kullanıcı formu DOLDURUP GÖNDERDİ mi? (POST)
    if request.method == 'POST':
        # Gelen verileri form sınıfımıza bağlıyoruz
        form = IletisimFormu(request.POST) 
        
        # Django bizim için verileri otomatik kontrol ediyor (Boş mu? Çok mu uzun?)
        if form.is_valid(): 
            # Veriler temiz ve güvenliyse 'cleaned_data' sözlüğünden alıyoruz
            isim = form.cleaned_data['isim_soyisim']
            mesaj = form.cleaned_data['kullanici_mesaji']
            
            # Burada e-posta atma işlemleri vs. yapılabilir...
            return HttpResponse(f"Harika {isim}, form başarıyla doğrulandı ve verin alındı!")
            
    # 2. Kullanıcı sayfaya İLK DEFA mı girdi? (GET)
    else:
        # Ekranda göstermek için boş bir form nesnesi oluşturuyoruz.
        form = IletisimFormu() 

    # Hata varsa (is_valid False döndüyse) veya sayfa ilk kez açılıyorsa formu şablona gönder
    context = {'form': form}
    return render(request, 'iletisim.html', context)

Dikkat ederseniz: Manuel yöntemde boş bıraksalar bile kontrol etmemiz gerekirdi. Şimdi ise form.is_valid() komutu tüm zor işi yapıyor!


3. Adım: Şablonu (HTML) Güncellemek (iletisim.html)

HTML tarafında işler inanılmaz derecede kolaylaşır. Tek tek <input> veya <textarea> etiketleri yazmanıza gerek kalmaz.

HTML
<form method="POST" action="/iletisim/">
    {% csrf_token %}
    
    {{ form.as_p }}
    
    <button type="submit">Gönder</button>
</form>

Sadece {{ form.as_p }} yazarak formun içindeki tüm etiketleri (label) ve girdi alanlarını (input) sayfaya yazdırmış olduk. Hatta kullanıcı formu hatalı doldurursa (örneğin 100 karakterden uzun bir isim girerse), Django aynı formu ekrana basarken kırmızı hata mesajlarını da otomatik olarak bu alanların yanına ekler.


🌟 Bonus: Veritabanı ile Doğrudan Bağlantı (ModelForm)

Eğer amacınız sadece bir e-posta atmak değil de bu veriyi doğrudan veritabanına kaydetmekse, forms.Form yerine forms.ModelForm kullanılır. Bu, işleri bir adım daha kısaltır.

Diyelim ki IletisimMesaji adında bir veritabanı modeliniz var. Formunuzu şu şekilde yazabilirsiniz:

Python
from django import forms
from .models import IletisimMesaji

class IletisimModelForm(forms.ModelForm):
    class Meta:
        model = IletisimMesaji # Bu form hangi veritabanı tablosuna bağlı?
        fields = ['isim_soyisim', 'kullanici_mesaji'] # Hangi alanlar formda görünsün?

Bu form türünü views.py içinde is_valid() ile doğruladıktan sonra, tek tek verileri çekmek yerine sadece form.save() yazmanız, verinin veritabanına tablo olarak kaydedilmesi için yeterlidir!


Gördüğünüz gibi Django Forms, GET ve POST trafiğini yönetirken kod tekrarını önler ve güvenliği maksimuma çıkarır.


1️⃣ HTTP Nedir?

HTTP (Hyper Text Transfer Protocol), tarayıcı ile sunucu arasında veri alışverişini sağlayan protokoldür.

Örneğin:

  • Tarayıcı bir sayfa ister → GET

  • Kullanıcı form gönderir → POST

Django bu işlemleri views.py dosyasında karşılar.


2️⃣ GET Metodu Nedir?

GET metodu sunucudan veri istemek için kullanılır.

📌 Özellikleri:

  • Veriler URL’de görünür.

  • Genellikle veri çekme (listeleme, arama) için kullanılır.

  • Güvenli veri gönderimi için uygun değildir.

  • Bookmark yapılabilir.

Örnek URL:

http://127.0.0.1:8000/arama/?kelime=django

Burada kelime=django GET parametresidir.


Django’da GET Kullanımı

views.py

from django.shortcuts import render

def arama(request):
    kelime = request.GET.get("kelime")
    return render(request, "arama.html", {"kelime": kelime})

arama.html

<form method="get">
    <input type="text" name="kelime">
    <button type="submit">Ara</button>
</form>

<p>Aranan kelime: {{ kelime }}</p>

GET İşleyiş Görseli

[ Kullanıcı Tarayıcı ]
        |
        |  GET /arama/?kelime=django
        v
[ Django View ]
        |
        |  request.GET["kelime"]
        v
[ Template ]
        |
        v
Ekrana Sonuç Yazdırılır

3️⃣ POST Metodu Nedir?

POST metodu sunucuya veri göndermek için kullanılır.

📌 Özellikleri:

  • Veriler URL’de görünmez.

  • Güvenli veri gönderimi için uygundur.

  • Form işlemlerinde kullanılır.

  • CSRF token gerektirir.


Django’da POST Kullanımı

views.py

from django.shortcuts import render

def mesaj_ekle(request):
    if request.method == "POST":
        ad = request.POST.get("ad")
        mesaj = request.POST.get("mesaj")
        return render(request, "sonuc.html", {"ad": ad, "mesaj": mesaj})

    return render(request, "mesaj.html")

mesaj.html

<form method="post">
    {% csrf_token %}
    <input type="text" name="ad" placeholder="Adınız">
    <textarea name="mesaj"></textarea>
    <button type="submit">Gönder</button>
</form>

POST İşleyiş Görseli

[ Kullanıcı Formu Doldurur ]
        |
        |  POST /mesaj/
        v
[ Django View ]
        |
        | request.method == "POST"
        | request.POST["ad"]
        v
[ Template / Database ]
        |
        v
Veri Kaydedilir veya Gösterilir

4️⃣ GET ve POST Arasındaki Farklar

ÖzellikGETPOST
Amaç    Veri çekme    Veri gönderme
Güvenlik    Düşük    Daha güvenli
URL’de görünür mü?    Evet    Hayır
Veri sınırı    Var    Daha geniş
Bookmark    Evet    Hayır
CSRF Token    Gerekmez    Gerekir

5️⃣ request.method Kontrolü

Django’da bir view içinde genellikle şu yapı kullanılır:

if request.method == "POST":
    # form gönderildi
else:
    # sayfa ilk açıldı

Bu yapı, hem GET hem POST işlemini aynı view içinde yönetmemizi sağlar.


6️⃣ Gerçek Hayat Senaryosu (Mini Lab)

📌 Basit Not Ekleme Sistemi

Amaç:

Öğrenci not eklesin (POST)
Notları listeleyelim (GET)

Mantık:

  • Sayfa ilk açıldığında → GET → Notları göster

  • Form gönderildiğinde → POST → Notu ekle


7️⃣ Güvenlik: CSRF Token Nedir?

Django POST işlemlerinde güvenlik için CSRF koruması kullanır.

Form içinde mutlaka şunu yazmalıyız:

{% csrf_token %}

Yazmazsak hata alırız:

403 Forbidden (CSRF verification failed)

8️⃣ Daha Profesyonel Kullanım

Django’da Class Based View kullanırken:

from django.views import View

class MesajView(View):
    def get(self, request):
        return render(request, "mesaj.html")

    def post(self, request):
        ad = request.POST.get("ad")
        return render(request, "sonuc.html", {"ad": ad})

Burada GET ve POST ayrı metodlarda yazılır.


9️⃣ Özet

✔ GET → Veri almak
✔ POST → Veri göndermek
✔ request.GET → URL parametreleri
✔ request.POST → Form verileri
✔ request.method → Hangi işlem geldiğini kontrol eder


🎯 Sınavda Çıkabilecek Sorular

  1. GET ve POST arasındaki farkları yazınız.

  2. Django’da POST işlemi neden CSRF token ister?

  3. request.GET ile request.POST arasındaki fark nedir?

  4. request.method neden kontrol edilir?


📄 DJANGO GET & POST – UYGULAMALI MİNİ PROJE SINAV KAĞIDI


🎯 Proje Adı:

📚 Öğrenci Mesaj ve Arama Sistemi


🧠 Senaryo

Bir okul için basit bir web uygulaması geliştirmeniz isteniyor.

Sistemde:

  • Kullanıcı mesaj gönderebilecek (POST)

  • Kullanıcı mesajlarda arama yapabilecek (GET)

  • Gönderilen mesajlar listelenecek

Bu projede özellikle:

  • request.method

  • request.GET

  • request.POST

  • CSRF koruması

kullanmanız zorunludur.


🧩 PROJE GEREKSİNİMLERİ


1️⃣ Model (models.py)

Aşağıdaki alanlara sahip bir model oluşturunuz:

ad (CharField)
mesaj (TextField)
tarih (DateTimeField - auto_now_add=True)

Model adı: Mesaj


2️⃣ URL Yapısı (urls.py)

Aşağıdaki URL’leri tanımlayınız:

/           → mesaj_list
/ekle/      → mesaj_ekle
/arama/     → mesaj_arama

3️⃣ Mesaj Ekleme (POST İşlemi)

Şartlar:

  • Form method="post" olacak

  • {% csrf_token %} kullanılacak

  • request.method == "POST" kontrolü yapılacak

  • Formdan gelen veriler request.POST.get() ile alınacak

  • Veri veritabanına kaydedilecek

  • Başarılı kayıt sonrası ana sayfaya yönlendirilecek


📌 Beklenen Form Alanları:

  • Adınız

  • Mesajınız


4️⃣ Mesaj Listeleme (GET İşlemi)

Ana sayfada:

  • Tüm mesajlar listelenecek

  • En yeni mesaj en üstte olacak


5️⃣ Mesaj Arama (GET Parametresi)

Kullanıcı ana sayfada bir arama kutusu görecek.

Form:

<form method="get">

Arama işlemi:

  • URL örneği:

/?kelime=django
  • request.GET.get("kelime") kullanılacak

  • Mesaj içinde geçen kelimelere göre filtreleme yapılacak


📊 İŞLEYİŞ DİYAGRAMI


GET Akışı

Kullanıcı → Arama Formu → URL Parametresi →
request.GET → Filtreleme → Listeleme


POST Akışı

Kullanıcı → Formu Doldurur →
POST /ekle/ →
request.POST →
Veritabanına Kayıt →
Redirect


🧪 UYGULAMA ADIMLARI

  1. Django proje oluşturunuz.

  2. Uygulama (app) oluşturunuz.

  3. Modeli yazınız.

  4. Migration işlemlerini yapınız.

  5. Admin paneline modeli ekleyiniz.

  6. View fonksiyonlarını yazınız.

  7. Template dosyalarını oluşturunuz.

  8. GET ve POST işlemlerini test ediniz.


📝 SINAV SORULARI (YAZILI BÖLÜM)

  1. GET ve POST arasındaki farkları yazınız.

  2. Django’da POST işlemlerinde neden CSRF token kullanılır?

  3. request.GET ile request.POST arasındaki teknik fark nedir?

  4. request.method neden kontrol edilir?

  5. Arama işlemi neden GET ile yapılmalıdır?


⭐ EKSTRA PUAN (İSTEĞE BAĞLI)

  • Bootstrap ile tasarım

  • Arama sonucu bulunamazsa uyarı mesajı

  • Mesaj silme özelliği

  • Class Based View kullanımı

  • Mesaj sayısını gösterme


📌 Değerlendirme Ölçütü

KriterPuan
Model Doğru15
POST İşlemi20
GET İşlemi20
Arama Sistemi15
Template Düzeni10
Kod Temizliği10
Yazılı Sorular10
Toplam100

Yorumlar

Bu blogdaki popüler yayınlar

Pardus Üzerine Django Kurulumu

Python ile Web Geliştirme: Django App Oluşturma