İçeriğe geç
Muslu Yüksektepe

Django'da özel middleware

Django'da kendi middleware katmanınızı nasıl yazacağınızı anlatan Türkçe örnek uygulama.

Bu depo, Django'daki middleware (katman) mantığını ve kendi middleware'inizi nasıl yazacağınızı anlatan Türkçe bir örnek uygulama içeriyor. 2016 yılının Mayıs ayında Django 1.9 ile hazırladım. Kodun yanında konuyu adım adım anlatan Türkçe bir PDF doküman ve onun İngilizce çevirisi de depoda bulunuyor.

Amaç

Django'da bir adres açıldığında urls.py ilgili fonksiyonu bulur, fonksiyon çalışır ve tarayıcıya bir yanıt döner. Peki her sayfada çalışması gereken bir işlem varsa, örneğin ziyaretçinin IP adresini kontrol etmek gerekiyorsa, bunu bütün fonksiyonlara tek tek yazmak mı gerekir? Hayır; middleware tam olarak bu iş için var. Middleware, her isteğin görünüme ulaşmadan önce ve her yanıtın tarayıcıya gitmeden önce geçtiği katmandır. Bu yapı Django'nun içinde sessizce çalıştığı için yeni başlayanlar arka planda neler olduğunu çoğu zaman göremez. Ben bu örneği, katmanların hangi sırayla çalıştığını ekrana yazdırarak somut olarak göstermek için hazırladım.

Nasıl çalışır

Örnek katman uyeler/ozel_islemler.py dosyasındaki IPKontrolMiddleware sınıfı. Dosya adını bilerek middleware.py yerine farklı seçtim; okuyanın bunun bir kalıp olmadığını, Django'nun katmanı ayarlardaki yoldan bulduğunu görmesini istedim. Sınıfta iki metot var. process_request, istek geldiğinde çalışıyor ve ziyaretçinin IP adresini izin verilen adresler listesiyle karşılaştırıyor. Adres listede yoksa PermissionDenied hatası fırlatılıyor ve görünüm hiç çalışmadan 403 Forbidden yanıtı dönüyor. Adres listedeyse metot None döndürüyor ve istek yoluna devam ediyor. process_response ise görünüm çalıştıktan sonra, yanıt tarayıcıya gönderilmeden hemen önce devreye giriyor.

Katman, settings.py içindeki MIDDLEWARE_CLASSES listesinin en sonuna ekleniyor. Dokümanda bu listedeki sıranın önemli olduğunu, bir katmanın kullanacağı bilgilerin kendisinden önceki katmanlarda hazırlanmış olması gerektiğini anlatırım.

Doküman nasıl ilerliyor

Doküman, her adımda geliştirme sunucusunun ekrana yazdığı satırları gösteriyor. Önce IP adresi listede yokken ana sayfa açılıyor ve isteğin görünüme ulaşmadan reddedildiği görülüyor. Ardından adres listeye ekleniyor ve bu kez sıranın katman, urls.py, görünüm ve yeniden katman şeklinde ilerlediği izleniyor. Son olarak giriş ve çıkış sayfaları ekleniyor. Giriş yapılmamışken request.user değerinin AnonymousUser olduğu, giriş yapıldıktan sonra kullanıcının e-posta adresine dönüştüğü katmanın çıktısından takip ediliyor.

Örnek projedeki diğer parçalar

  • Giriş, çıkış ve yalnızca giriş yapanlara açık ana sayfa görünümleri urls.py içinde tanımlı.
  • uyeler uygulamasındaki üye modeli, yeni bir üye kaydedildiğinde ona bağlı bir Django kullanıcısını kendiliğinden oluşturuyor. Üyenin e-posta gönderme ve yorum yapma izinleri, kayıt limiti ve üyelik bitiş tarihi de bu modelde tutuluyor.
  • kayit uygulamasındaki haber modeli, üyenin kalan kayıt limitini hesaplamak için kullanılıyor.
  • Proje SQLite kullandığı için indirildikten sonra hemen çalıştırılabiliyor.
Kategori
Eğitim ve topluluk
Yıl
2016

Teknolojiler

  • Python
  • Django
  • Education

Bağlantılar

  • GitHub https://github.com/muslu/django_ozel_middleware

Tüm projelere dön