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):
<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):
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']yerinerequest.GET.get('sorgu')kullanmak her zaman daha güvenlidir. Eğer URL'de 'sorgu' parametresi yoksa ilk yöntemMultiValueDictKeyErrorhatası fırlatırken,.get()yöntemi nazikçeNonedö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):
<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):
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
| Özellik | GET Metodu | POST Metodu |
| Temel İşlev | Veri getirme/okuma | Veri gönderme/yazma/güncelleme |
| Veri Konumu | URL (Query String) | HTTP İstek Gövdesi (Body) |
| Güvenlik | Düşük (Şifreler URL'de görünür) | Yüksek (Veriler gövdede taşınır) |
| Veri Boyutu | Sı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şi | Kaydedilir | Kaydedilmez |
| Django'da Veri Alma | request.GET.get('anahtar') | request.POST.get('anahtar') |
| CSRF Token | Gerekmez | Zorunludur ({% 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.
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 (CharField, EmailField, IntegerField 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.
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.
<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:
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
| Özellik | GET | POST |
|---|---|---|
| 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
GET ve POST arasındaki farkları yazınız.
Django’da POST işlemi neden CSRF token ister?
request.GET ile request.POST arasındaki fark nedir?
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.methodrequest.GETrequest.POSTCSRF 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ılacakrequest.method == "POST"kontrolü yapılacakFormdan gelen veriler
request.POST.get()ile alınacakVeri 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ılacakMesaj 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
Django proje oluşturunuz.
Uygulama (app) oluşturunuz.
Modeli yazınız.
Migration işlemlerini yapınız.
Admin paneline modeli ekleyiniz.
View fonksiyonlarını yazınız.
Template dosyalarını oluşturunuz.
GET ve POST işlemlerini test ediniz.
📝 SINAV SORULARI (YAZILI BÖLÜM)
GET ve POST arasındaki farkları yazınız.
Django’da POST işlemlerinde neden CSRF token kullanılır?
request.GET ile request.POST arasındaki teknik fark nedir?
request.method neden kontrol edilir?
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ü
| Kriter | Puan |
|---|---|
| Model Doğru | 15 |
| POST İşlemi | 20 |
| GET İşlemi | 20 |
| Arama Sistemi | 15 |
| Template Düzeni | 10 |
| Kod Temizliği | 10 |
| Yazılı Sorular | 10 |
| Toplam | 100 |
Yorumlar
Yorum Gönder