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ı ⚖️

DurumKullanım
Sayfa hiç yok404
Sayfa taşındıredirect
URL değiştiredirect
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ı

  1. Yeni bir Django proje oluştur

  2. Var olmayan bir URL’ye git

  3. Varsayılan 404 ekranını gözlemle

  4. 404.html dosyasını oluştur

  5. DEBUG=False yap

  6. 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 sayfa

  • http://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)

  1. Django 404 hatasını ne zaman verir?

  2. DEBUG=True iken neden özel 404 görünmez?

  3. 404 yerine her sayfayı ana sayfaya yönlendirmek neden yanlıştır?

  4. 404.html dosyası 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 templates klasörünüzde 404.html adı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:

HTML
{% 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.

  1. Projenizin settings.py dosyasını açın.

  2. DEBUG ayarını bulun ve False yapın.

  3. ALLOWED_HOSTS ayarını güncelleyin (Debug kapalıyken bu ayar zorunludur).

settings.py:

Python
# 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:

Bash
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:

Python
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:

Python
# 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

  1. Statik Dosyalar: DEBUG = False olduğ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) veya whitenoise kütüphanesi ile bu sorun çözülür.

  2. Geri Almayı Unutmayın: Test işleminiz bittikten sonra geliştirmeye devam etmek için DEBUG = True yapmayı 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

Bu blogdaki popüler yayınlar

Pardus Üzerine Django Kurulumu

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