Django Projelerinde "Sayfa Bulunamadı" Hatası Nasıl Yönetilir?
Django projelerinde kullanıcı deneyimini artırmanın en önemli adımlarından biri, kullanıcı yanlış bir linke tıkladığında onu korkutucu teknik hata kodları yerine, yol gösterici şık bir sayfayla karşılamaktır.
Bir web uygulamasında kullanıcılar bazen silinmiş bir içeriğe, hatalı yazılmış bir URL'ye veya taşınmış bir sayfaya ulaşmaya çalışabilirler. Bu durumda sunucu standart bir 404 Not Found (Bulunamadı) yanıtı döndürür.
Django'da varsayılan olarak geliştirme aşamasında teknik detayları içeren sarı bir hata ekranı görürüz. Ancak canlı ortamda (production) kullanıcılarınıza markanıza uygun, yardımcı bir "Yolunu Kaybetmiş Olabilirsin" sayfası göstermek çok daha profesyoneldir.
Django’da Sayfa Bulunamaz (404) Hatası
Sayfa Bulunamazsa Ne Yapılır? (Eğitim Makalesi)
🎯 Makalenin Amacı
Bu makalede:
Django’da 404 Page Not Found hatası nedir?
Bu hata neden oluşur?
Özel (custom) 404 sayfası nasıl hazırlanır?
Geliştirme ve canlı ortamda (DEBUG) farklar nelerdir?
Öğrenciye yönelik LAB / uygulama etkinliği
öğrenilecektir.
1️⃣ 404 Hatası Nedir?
404 Page Not Found, kullanıcının tarayıcıdan istediği URL’ye karşılık gelen bir sayfa (view) Django tarafından bulunamadığında oluşur.
📌 Django, URL eşleşmesi yapamazsa otomatik olarak 404 hatası döndürür.
2️⃣ Django’da 404 Hatası Neden Oluşur?
En sık karşılaşılan sebepler:
🔹 1. URL Tanımlı Değil
# urls.py
urlpatterns = [
path("anasayfa/", views.index),
]
Kullanıcı:
/home/
adresine giderse → 404
🔹 2. Yanlış URL Yazımı
/urun/1/urunler/1/
➡️ Slash (/) eksikliği bile 404’e sebep olabilir.
🔹 3. View Dosyası Silinmiş veya Taşınmış
views.py içinde tanımlı fonksiyon yoksa Django sayfayı bulamaz.
🔹 4. include() Eksikliği
Ana urls.py dosyasında app url’leri eklenmemişse:
path("blog/", include("blog.urls"))
3️⃣ Django Varsayılan 404 Sayfası
DEBUG = True
→ Detaylı hata ekranı (geliştirici için)DEBUG = False
→ Kullanıcıya sade 404 sayfası gösterilir
⚠️ Canlı sistemde DEBUG kesinlikle False olmalıdır.
4️⃣ Django’da Özel (Custom) 404 Sayfası Yapımı ⭐
📁 Adım 1: 404.html Dosyası Oluştur
templates/
└── 404.html
📄 Adım 2: 404.html İçeriği
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Sayfa Bulunamadı</title>
</head>
<body>
<h1>404</h1>
<p>Aradığınız sayfa bulunamadı.</p>
<a href="/">Ana Sayfaya Dön</a>
</body>
</html>
⚙️ Adım 3: settings.py Ayarları
DEBUG = False
ALLOWED_HOSTS = ["*"] # Geliştirme için
📌 Django, otomatik olarak templates/404.html dosyasını kullanır.
5️⃣ handler404 ile Özel View Kullanma (İleri Seviye)
🔹 urls.py
handler404 = "core.views.custom_404"
🔹 views.py
from django.shortcuts import render
def custom_404(request, exception):
return render(request, "404.html", status=404)
📌 Bu yöntem ile:
Log tutma
Farklı tasarım
Kullanıcıya mesaj
eklenebilir.
6️⃣ 404 ve Redirect Farkı ⚖️
| Durum | Kullanım |
|---|---|
| Sayfa hiç yok | 404 |
| Sayfa taşındı | redirect |
| URL değişti | redirect |
| Kullanıcı hatası | 404 |
❌ 404 yerine her şeyi ana sayfaya yönlendirmek yanlış UX’tir.
7️⃣ Öğrenci LAB Etkinliği 🧪
🎯 Amaç
Öğrenci, Django’da 404 hatasını tanır ve özel hata sayfası oluşturur.
📌 LAB Adımları
Yeni bir Django proje oluştur
Var olmayan bir URL’ye git
Varsayılan 404 ekranını gözlemle
404.htmldosyasını oluşturDEBUG=False yap
Kendi tasarladığın 404 sayfasını test et
8️⃣ Sık Yapılan Hatalar ❌
DEBUG=True iken 404 sayfasını test etmek
templates klasör yolunu yanlış ayarlamak
404.html’yi alt klasöre koymak
handler404 tanımlayıp import etmeyi unutmak
9️⃣ SEO ve Kullanıcı Deneyimi Açısından 404
✅ İyi bir 404 sayfası:
Kullanıcıyı sitede tutar
SEO’ya zarar vermez
Ana sayfaya yönlendirme sunar
📌 Google, doğru 404 kullanımını olumlu kabul eder.
🔚 Sonuç
Django’da 404 Page Not Found:
Bir hata değil,
Doğru yönetilmesi gereken bir kullanıcı deneyimi unsurudur.
Özel 404 sayfaları ile:
✔ Daha profesyonel
✔ Daha güvenli
✔ Daha kullanıcı dostu
web uygulamaları geliştirebilirsiniz.
Aşağıda 404 sayfası odaklı, hazır bir Django mini projeyi adım adım, öğretimde direkt kullanılabilir (11. sınıf web dersi ve LAB çalışması için uygundur.)
🎯 Django Mini Proje
“Özel 404 Sayfası Olan Basit Web Uygulaması”
📌 Proje Amacı
Bu mini projede öğrenci:
Django URL–View–Template yapısını kavrar
404 hatasının nasıl oluştuğunu görür
Özel (custom) 404 sayfası oluşturur
DEBUG=True / False farkını öğrenir
1️⃣ Proje Yapısı
django_404_project/
│
├── manage.py
├── django_404_project/
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│
├── pages/
│ ├── views.py
│ ├── urls.py
│ └── templates/
│ ├── index.html
│
└── templates/
└── 404.html
2️⃣ Proje Oluşturma
django-admin startproject django_404_project
cd django_404_project
python manage.py startapp pages
3️⃣ settings.py Ayarları
🔹 App’i ekle
INSTALLED_APPS = [
...
"pages",
]
🔹 Template ayarı
TEMPLATES = [
{
...
"DIRS": [BASE_DIR / "templates"],
...
},
]
🔹 404 testi için
DEBUG = False
ALLOWED_HOSTS = ["*"]
4️⃣ Ana Sayfa (index)
📄 pages/views.py
from django.shortcuts import render
def index(request):
return render(request, "index.html")
📄 pages/urls.py
from django.urls import path
from .views import index
urlpatterns = [
path("", index, name="home"),
]
📄 django_404_project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("pages.urls")),
]
📄 pages/templates/index.html
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Ana Sayfa</title>
</head>
<body>
<h1>Django Mini Proje</h1>
<p>Bu sayfa çalışıyor ✅</p>
<a href="/olmayan-sayfa">Hatalı Sayfaya Git</a>
</body>
</html>
5️⃣ Özel 404 Sayfası ⭐
📄 templates/404.html
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>404 | Sayfa Bulunamadı</title>
</head>
<body style="text-align:center; font-family:Arial;">
<h1>404</h1>
<h2>Sayfa Bulunamadı</h2>
<p>Aradığınız sayfa mevcut değil.</p>
<a href="/">🏠 Ana Sayfaya Dön</a>
</body>
</html>
📌 Django, templates/404.html dosyasını otomatik kullanır.
6️⃣ Projeyi Çalıştırma
python manage.py runserver
Test Adımları
http://127.0.0.1:8000/→ ✅ Ana sayfahttp://127.0.0.1:8000/xyz→ ❌ Özel 404 sayfası
7️⃣ Öğrenci LAB Görevleri 🧪
📝 Görev 1
404 sayfasına:
Bir görsel ekle
Arka plan rengi değiştir
📝 Görev 2
404 sayfasına:
“İletişim” linki ekle
Ana sayfaya buton tasarla
📝 Görev 3
DEBUG=True yap:
Varsayılan 404 ekranını gözlemle
DEBUG=False ile karşılaştır
8️⃣ Ölçme – Değerlendirme (Kısa Sorular)
Django 404 hatasını ne zaman verir?
DEBUG=True iken neden özel 404 görünmez?
404 yerine her sayfayı ana sayfaya yönlendirmek neden yanlıştır?
404.htmldosyası nereye konulmalıdır?
9️⃣ Genişletme Fikirleri 🚀
handler404 ile özel view yazma
404 hatalarını log dosyasına yazma
Bootstrap ile modern 404 tasarımı
Çok dilli (TR / EN) 404 sayfası
✅ Sonuç
Bu mini proje ile öğrenci:
✔ Django mantığını kavrar
✔ Hataları doğru yönetmeyi öğrenir
✔ Profesyonel web yaklaşımı kazanır
1. Mantığı Anlamak: DEBUG Modu
Django projelerinde settings.py dosyasında DEBUG adında kritik bir ayar bulunur.
DEBUG = True: Geliştirme aşamasıdır. Bir hata olduğunda Django size hatanın nerede olduğunu, hangi satırda kodun kırıldığını gösteren detaylı (sarı renkli) bir rapor sunar. Bu modda özel 404 sayfanız görüntülenmez.
DEBUG = False: Canlı yayın modudur. Django güvenlik gereği hata detaylarını gizler. Eğer bir sayfa bulunamazsa, otomatik olarak
templatesklasörünüzde404.htmladında bir dosya arar ve onu gösterir.
2. Adım: 404.html Şablonunu Oluşturmak
Django, 404 hatası aldığında varsayılan olarak şablon klasörünüzün kök dizininde (templates/) 404.html dosyasını arar.
Projenizin templates klasörüne gidin ve 404.html adında yeni bir dosya oluşturun. İçeriğini projenizin tasarımına göre düzenleyebilirsiniz.
Örnek templates/404.html Kodu:
{% extends 'base.html' %}
{% block content %}
<div style="text-align: center; margin-top: 50px;">
<h1 style="font-size: 72px;">404</h1>
<h2>Üzgünüz, aradığınız sayfa bulunamadı.</h2>
<p>Gitmek istediğiniz sayfa silinmiş, taşınmış veya hiç var olmamış olabilir.</p>
<a href="{% url 'home' %}" class="btn btn-primary">
Ana Sayfaya Dön
</a>
</div>
{% endblock %}
İpucu: Kullanıcıyı boşlukta bırakmamak için mutlaka "Ana Sayfaya Dön" veya "İletişim" gibi yönlendirici butonlar ekleyin.
3. Adım: Ayarları Yapılandırmak ve Test Etmek
Özel sayfanızı yerel bilgisayarınızda test etmek için Django'yu geçici olarak "Canlı Ortam" moduna almamız gerekir.
Projenizin
settings.pydosyasını açın.DEBUGayarını bulun veFalseyapın.ALLOWED_HOSTSayarını güncelleyin (Debug kapalıyken bu ayar zorunludur).
settings.py:
# Güvenlik uyarısı: Canlıya alırken bunu False yapın!
DEBUG = False
# Localhost'ta çalışmasına izin ver
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
4. Adım: Çalıştırma
Terminalden sunucunuzu yeniden başlatın:
python3 manage.py runserver
Tarayıcınızda rastgele, var olmayan bir adres yazın (örneğin: http://127.0.0.1:8000/boyle-bir-sayfa-yok). Artık sarı hata ekranı yerine, hazırladığınız özel 404 tasarımını göreceksiniz.
İleri Seviye: Görünümü (View) Özelleştirmek
Eğer 404 sayfasına veritabanından veri göndermek (örneğin "Popüler Yazılar" listesi göstermek) isterseniz, varsayılan davranışı ezebilirsiniz.
Bunun için urls.py dosyanıza özel bir fonksiyon tanımlamanız gerekir.
1. views.py dosyasına özel fonksiyon ekleyin:
from django.shortcuts import render
def custom_page_not_found_view(request, exception):
context = {
"onerilen_baslik": "Aradığınızı bulamadınız ama bunları sevebilirsiniz:"
}
return render(request, "404.html", context, status=404)
2. Ana urls.py dosyasında bu fonksiyonu belirtin:
# Projenin ana urls.py dosyası
from django.conf.urls import handler404
# Hazırladığımız view'i buraya bağlıyoruz
handler404 = 'uygulama_adiniz.views.custom_page_not_found_view'
Özet ve Dikkat Edilmesi Gerekenler
Statik Dosyalar:
DEBUG = Falseolduğunda Django statik dosyaları (CSS, JS, Resimler) otomatik sunmayı durdurur. Sayfanızın CSS'i bozuk görünürse endişelenmeyin, bu normaldir. Canlı sunucuda (Nginx/Apache) veyawhitenoisekütüphanesi ile bu sorun çözülür.Geri Almayı Unutmayın: Test işleminiz bittikten sonra geliştirmeye devam etmek için
DEBUG = Trueyapmayı unutmayın. Aksi takdirde yazdığınız kodlardaki hataları göremezsiniz.
Artık projeniz hatalı durumlarda bile kullanıcı dostu bir deneyim sunmaya hazır!
Bu makale, Pardus ve Açık Kaynak eğitim serisi kapsamında hazırlanmıştır.
Yorumlar
Yorum Gönder