Merhabalar. Bir çok platformda Django, batteries included web framework ibaresini görmüş olmalısınız. Bu ifadenin gerçekten altı fazlası ile dolu.
Django yerleşik olanlar dışında bir çok opsiyonel uygulamada sağlamaktadır. Bugün onlardan biri olan Redirects uygulamasını konuşacağız.
Geliştirdiğimiz uygulamalarda gelen isteklere bağlı veya yapısal değişiklikler(SEO dostu geliştirme vs) sonucu sunduğumuz içeriğin URL yolu değişebilmektedir. Tüm internet üzerinde uygulamamızı işaret eden linklemeleri değiştiremeyeceğimiz için, istemcinin bir 404 sayfası ile karşılanması durumu oluşmaktadır. Fakat redirects uygulaması ile bunu dert etmemize gerek yok. 🙂
Çalışma mantığı ve kurulum.
Redirects uygulaması veritabanı gereksinimine sahiptir. Basitçe bir tabloda old_path,new_path ve site_id tutulur. Bu tablonun elemanları, sırası ile kaldırılan url pathi, yeni url pathi, ve hangi siteye bağlı olduğunu belirten bir Site nesnesidir.
Değişecek url’ler veritabanına kayıt edildikten sonra tüm işlemi RedirectFallbackMiddleware yapar.
Herhangi bir zamanda Django uygulama ya da uygulamalarımız 404 hatası döndürmeye çalıştığında bu middleware son çare olarak site kimliğini baz alarak istemcinin istekte bulunduğu URL’in bir yönlendirmeye sahip olup olmadığını kontrol eder.
Eğer bir yönlendirme sağlanmış ise 404 dönmek yerine araya girerek kullanıcıya 301 (Moved permanently) cevabı ve taşınan url’in yeni endpointini döner.
Eğer web sunucumuzu (Nginx,Apache vs) 301 cevapları için konfigüre etmiş isek kullanıcı yeni endpointe direkt olarak yönlendirmiş oluruz.
Kurulum.
İlk olarak iki uygulamayı kayıt etmemiz gerekmekte.
INSTALLED_APPS = [ # your project apps "django.contrib.sites", "django.contrib.redirects", ]
Redirects uygulamasını ve bağımlı olduğu Site uygulamasını kayıt ettikten sonra Django uygulama ayarlarına çalışılan sitenin id’sini belirtmemiz gerekmekte. (Tek bir Django uygulamanız var ise default 1)
SITE_ID = 1
Son olarak middeware kaydını tamamlamamız gerekmekte.
MIDDLEWARE = [ # your app middlewares. "django.contrib.redirects.middleware.RedirectFallbackMiddleware", ]
Burada listenin en sonuna eklediğimize dikkat edelim. Django middleware konusuna aşina iseniz çalışma sıralamasının büyük bir önem taşıdığını biliyor olmalısınız. Uygulamamızın, son çare olarak buraya başvuracağını hatırlıyor ve son sırada konumlandırıyoruz.
Middleware’ler hakkında daha detaylı bilgi sahibi olmak isterseniz, yakın zamanda bir yazı yazdım. Link burada keyifli okumalar. 🙂
Ve tamamız!
Geliştirme sunucunuzu durdurup gerekli migrationları yaptıktan sonra tekrar başlatmayı unutmayın 🙂
Redirect eklemek, güncellemek, silmek.
Django admin ile.
Eğer uygulamanızda admin uygulaması kullanıyor iseniz bu işlemler çok basit.
egehangundogdu.com/me/ altında sunulan içeriğimizi egehangundogdu.com/about/ altına taşıdık.
Python API ile.
Admin paneli her zaman uygulamalarımızın bir parçası olmayabilir veya erişiminiz kısıtlı olabilir. Bu gibi durumlarda Django shellinde bu işlemleri manuel olarak yapabiliriz.
Shell’e düştükten sonra aynı işlemi tekrarlayalım. (Eğer sırası ile takip ediyorsanız site ve old_path unique together yapıdadır. Unique constraint hatasından kaçınmak için bir önceki redirecti silmelisiniz.)
from django.conf import settings from django.contrib.sites.models import Site from django.contrib.redirects.models import Redirect site = Site.objects.get(id=settings.SITE_ID) Redirect.objects.create(old_path="/me/",new_path="/about/",site=site) <Redirect: /me/ ---> /about/>
Test edelim!
$ http localhost:8000/me/ HTTP/1.1 301 Moved Permanently Content-Length: 0 Content-Type: text/html; charset=utf-8 Date: Sat, 28 Nov 2020 15:36:33 GMT Location: /about/ Referrer-Policy: same-origin Server: WSGIServer/0.2 CPython/3.8.5 X-Content-Type-Options: nosniff X-Frame-Options: DENY
301 cevabı ve yönlendirilecek path dönüldü. Şimdi istemcimize bir yönlendirme var ise yönlendirmeyi takip etmesi gerektiğini belirtelim.
$ http --follow localhost:8000/me/ HTTP/1.1 200 OK Content-Length: 20 Content-Type: application/json Date: Sat, 28 Nov 2020 15:38:52 GMT Referrer-Policy: same-origin Server: WSGIServer/0.2 CPython/3.8.5 X-Content-Type-Options: nosniff X-Frame-Options: DENY { "ok": "it's working!" }
Her şey tamam görünüyor.
Not. Eğer 301 moved permanently yerine 302 moved temporarily cevabı dönmek isterseniz. RedirectFallBackMiddleware’i miras alan yeni bir middleware yazarak response_redirect_class’ı django.http.HTTPResponseRedirect ile değiştirebilirsiniz.
Django gerçekten çok güçlü ve kapsamlı bir framework. Bugün bir yeteneğine daha göz attık. Değişen urller ile mücadele ederken redirects uygulaması işinize fazlası ile yarayabilir..
İyi günler dilerim!
İlk Yorumu Siz Yapın