Django Sayfa Yönlendirme
Python tabanlı ve Django kullanılarak hazırlanan bir web sitesinde sayfalar arası geçiş, yönlendirme ve navigasyon işlemleri nasıl yapılır? Oldukça kullanışlı Django Kütüphanesi ile kolayca sayfalara yönlendirme yapabilirsiniz. Dinamik ve Statik olarak iki farklı yöntem ile Django sayfa yönlendirme işlemini yapabilirsiniz.

Django Sayfa Yönlendirme metodlarını kullanarak çok hızlı ve optimize bir şekilde Python ile hazırlanan web sayfaları arasında geçiş sağlayabilirsiniz. Bunun için ihtiyacınız olan biraz Python bilgisi ve biraz da Django kütüphanesine hakim olmaktır.
Django için GitHub Proje Linki:
https://github.com/omersahintr/WebApps
Eğer göz atmak isterseniz buraya Django Kütüphanesinin kurulumu ve başlangıç ayarları ile ilgili sayfamızın bir linkini bırakıyorum.
Index
Django Yönlendirme Çeşitleri
Statik Django Sayfa Yönlendirmeleri
Şimdi birden fazla site içi sayfa yönlendirmeleri Django’da nasıl yapılır kısaca değinmeye çalışalım.
- Cisco Course
- Python Course
şeklinde iki kurs bulunsun sitemizde. Bu senaryoya göre her iki kurs için de dinamik Url yönlendirmesi yapalım. Proje/views.py dosyasını açalım ve aşağıdaki satırları ekleyelim.
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("First Django Project Test OK.")
def cisco_course(request):
return HttpResponse("Network Cisco Course")
def python_course(request):
return HttpResponse("Python Course")
Project/views.pybu tanımlamalardan sonra uygulama altında bulunan urls.py içinde değişiklik yapalım.
from django.urls import path
from . import views
urlpatterns = [
path("",views.index, name="index"), ## url:index
##path("contacts",views.index, name="index") ## url:/contacts
path("cisco/", views.cisco_course, name="cisco"),
path("python/", views.python_course, name="Python")
]
App/urls.pySonrasında ” python manage.py runserver 8080” komutunu Terminal’de çalıştırarak sunucuyu aktif hale getirelim. Web browser’da http://127.0.0.1:8080/chat_message_app/python/ yazalım ve çalıştıralım.
Ekran Çıktısı:

Aynı şekilde http://127.0.0.1:8080/chat_message_app/cisco/ yazdığımızda Django Sayfa Yönlendirme işlemi çalışır ve şu sonucu üretir;

ekranlarını göreceksiniz.
Python Django ile Dinamik Yönlendirme
Bir sözlük, Json veya data file’dan sayfa verileri bulunsun. Bunları Django’da dinamik olarak tek satırda projeye nasıl ekleyebiliriz?
Öncelikle bir Dictionary tanımlayarak işe başlayalım. Bu dict içindeki sayfa verilerini sırasıyla tek satırda tanımlayarak dinamik yönlendirme ile karmaşanın önüne geçelim.
from django.shortcuts import render
from django.http import HttpResponse
course_dict = {
"python":"Welcome to Python Course",
"cisco":"Welcome to Cisco Course",
"java":"Java Course",
"charp":"C# Course",
"swift":"Swift Course"
}
def index(request):
return HttpResponse("First Django Project Test OK.")
def course(request, userurl): #user_url: user browser written url.
return HttpResponse(course_dict.get(userurl,"Page is Not Found - 404"))
Project/views.pyurls.py tarafında bir parametre ile url sonuna yazılacak olan sayfa adını almamız lazım. Bunun için path tanımlarken “<str:user_url>/” içinde alınacak parametre ve veri tipini belirleyebiliriz. Buradaki user_url ile views’ta parametre için verdiğini isim aynı olursa karışıklığın önüne geçmiş olursunuz.
from django.urls import path
from . import views
urlpatterns = [
path("",views.index, name="index"), ## url:index
path("<str:userurl>/", views.course, name="course")
]
App/urls.pyEkran Çıktıları:



Çoklu Integer Türünde Parametre Çekme İşlemi
Browser adres satırından birden fazla integer tipinde veriyi Django ile çekerek bu sayılarla matematiksel üs alma işlemi yaptırıp ekrana yazdıralım. Url’nin sonuna yazılacak olan ilk sayıya n1 ve ikinci sayıya n2 diyelim. Bu işlemi views.py dosyasında gerçekleştirelim:
from django.shortcuts import render
from django.http import HttpResponse
def pow_view(request,n1,n2):
return HttpResponse(f"{n1}^{n2}={pow(n1,n2)}")
Project/views.pyapp/urls.py dosyasında:
from django.urls import path
from . import views
urlpatterns = [
path("",views.index, name="index"), ## url:indlocalhost/app/
path("<int:n1>/<int:n2>/",views.pow_view,name="pow") ## url:localhost/app/2/8/
]
App/urls.pyEkran Çıktısı:

Django ile 404 Sayfa Bulunamadı Hatası Yönetimi
Django Sayfa Yönlendirme işlemleri arasında en önemli özelliklerden biri de hata sayfalarının yönetimidir. Yani kullanıcının adres satırından yazacağı yanlış bir url için 404-Sayfa Bulunamadı sayfasına yönlendirme ve hatta bu hata sayfasının tasarımına biraz göz atacağız.
Bunun çok kolay bir yolu var ama öncesinde Http404 alt kütüphanesini views.py dosyasına eklememiz gerekiyor.
from django.shortcuts import render
from django.http import HttpResponse, Http404
def course(request,userurl):
try:
course = course_dict[userurl]
return HttpResponse(course)
except:
raise Http404("404 - This page is not found!")
Project/views.pyApp/urls.py dosyasına ise;
from django.urls import path
from . import views
urlpatterns = [
path("",views.index, name="index"), ## url:indlocalhost/app/
path("<str:userurl>/", views.course, name="course") ## url:localhost/app/cisco/
]
App/urls.pyEkran Çıktısı:

Django Debug Mod Açma ve Kapama
Yukarıdaki resimde görülen kırmızı çerçeve içerisinde bizim belirlediğimiz hata mesajı görülüyor. Bu sayfayı sadece tasarımcı ve yazılımcının görebilmesi için detaylı “debug” modunda gösterilmektedir.
Geliştirme sona erdiğinde Project/settings.py dosyasında yapılacak bir değişiklik ile gösterimi kapatılabilir.
Debug Mod Aktif Etme İşlemi
Settings.py dosyasının 20-30 satırları arasında yer alan “DEBUG=True” parametresinde yapılacak değişiklik ile detaylı Django hata sayfası gösterimi açılıp kapatılabilir.

Debug Mod Kapatma İşlemi
Debug=False olarak ayarlarsanız hata sayfalarındaki detay bilgileri kullanıcılardan gizlenmiş olur. Ancak bunu yaptığınızda hemen bir alt satırda bulunan ALLOWED_HOSTS yani izin verilen host’lar bölümüne ALLOWED_HOSTS = [“localhost”] veya ALLOWED_HOSTS = [“127.0.0.1”] şeklinde string değer atamanız gerekir.

Debug modu False edip kapattıktan ve Allowed Hosts yani izin verilen host’ları “localhost” olarak belirledikten sonra 127.0.0.1 yazarsanız sunucu Bad Request (400) şeklinde hata sayfası döndürecektir.
Sunucu adına browser’dan localhost yazdığınızda ise eğer olmayan bir sayfayı çağırırsanız aşağıdaki gibi daha basit bir hata sayfası gösterilecektir.

Bu hata sayfasının tasarımını da değiştirebiliriz. Bunun için views.py dosyasında Try-Except bloğunda except’in altına bir return satırı ekleyeceğiz. Ayrıca bu işlemi yapmadan önce HttpResponseNotFound modülünü projeye dahil etmek gerekecektir.
Proje/views.py :
from django.shortcuts import render
from django.http import HttpResponse, Http404, HttpResponseNotFound
def course(request,userurl):
try:
course = course_dict[userurl]
return HttpResponse(course)
except:
return HttpResponseNotFound("404-Not Found Error!!!")
Project/views.pydosyayı kaydedip sayfayı yenilediğimizde bulunamayan sayfa için şu şekilde bir hata sayfası gösterilecektir:

Kalıcı Bağlantı Yönlendirme (Redirect) İşlemi
Yayından kaldırılacak olan bir sayfanın url yönlendirmesini farklı bir sayfaya yapmak için yada ID kullanımı ile site içi linklerin oluşturulması amacıyla Django’da Redirection işlemi yapmamız gerekebilir. Bunun için HttpResponseRedirect modülünü kullanacağız.
from django.shortcuts import render
from django.http import HttpResponse, Http404, HttpResponseNotFound, HttpResponseRedirect
course_dict = {
"python":"Welcome to Python Course",
"cisco":"Welcome to Cisco Course",
"java":"Java Course",
"charp":"C# Course",
"swift":"Swift Course"
}
def course_select(request,n1): ##localhost/1/ --> localhost/swift/
if n1 == 1:
return HttpResponseRedirect("swift")
else:
return HttpResponseNotFound("This page not found!")
Project/views.pyApp/urls.py :
from django.urls import path
from . import views
urlpatterns = [
path("<int:n1>",views.course_select,name="course_select")
]
App/urls.pySonuç olarak browser’dan localhost/app/1/ sayfamızı çağırdığımızda otomatik olarak Http-301 kalıcı bağlantı yönlendirme ile localhost/app/swift/ sayfasına yönlenecektir;

Bu yöntem çok fazla kullanılmaz, aralardaki kaçış sekmelerinde lokal bazlı ve geçici olarak kullanılabilir. Bunun yerine “name” parametrelerini kullancağımız Reversing metodu tercih edilir.
Django Bağlantı Reversing İşlemi
urls.py sayfasında tanımladığımız name parametrelerini kullanarak daha kullanışlı bir sayfa yönlendirme işlemi yapabiliriz. Bunun için views.py içerisine “from django.urls import reverse” modülünü eklememiz gerekiyor.
from django.urls import path
from . import views
urlpatterns = [
path("",views.index, name="index"), ## url:indlocalhost/app/
path("<int:n1>",views.course_select,name="course_select"),
path("<str:userurl>/", views.course, name="course"), ## url:localhost/app/cisco/
]
App/urls.pyProject/views.py :
from django.shortcuts import render
from django.http import HttpResponse, Http404, HttpResponseNotFound, HttpResponseRedirect
from django.urls import reverse
course_dict = {
"python":"Welcome to Python Course",
"cisco":"Welcome to Cisco Course",
"java":"Java Course",
"charp":"C# Course",
"swift":"Swift Course"
}
def course_select(request,n1): ##localhost/1/ --> localhost/cisco/
course_list = list(course_dict.keys()) ##get dictionary id's
try:
course = course_list[n1]
page = reverse("course", args=[course]) ##select urls.py paths name parameters
return HttpResponseRedirect(page)
except:
raise Http404("404 - This page is not found!")
Project/views.pyWeb browser’da localhost/app/0/ yazdığımızda sayfamız otomatik olarak python kursunun sayfasına yönlenecektir:

Django’da en profesyonel bağlantı yönlendirme şekli bu yöntemdir. Name parametreleri bu nedenle önemli hale geldi.