Skip to content

Django Middleware Kavramını Anlamak

middleware-django

Django'da middleware (ara katman yazılımı) nedir, nasıl, ne zaman, neden, nerede kullanılır öğrenelim.

Basit bir kod örneğiyle başlayalım:

def middleware_fonksiyonu(get_response):
    def middleware(request):
        # view fonksiyonundan önce çalışan kodlar
        response = get_response(request)
        # view fonksiyonundan sonra çalışan kodlar
        return response
    return middleware
Şimdi detaylara inelim:

Django'da middleware (ara katman yazılımı) nedir?

HTTP isteklerini ve yanıtlarını işlemek için bir mekanizmadır. Web sunucusu ile view fonksiyonu arasında yer alır ve istek(request) veya yanıt(response) nesneleri üzerinde çeşitli işlemler yapmanıza olanak sağlar.

Middleware neden ihtiyaç duyarız?

Django projelerinde her istek veya yanıt üzerinde yapılması gereken yaygın görevleri gerçekleştirmek için kullanışlı bir mekanizma sağlar. İstekleri değiştirmek, yanıtları işlemek, kimlik doğrulama yapmak, exceptions(istisnaları) yönetmek ve daha fazlasını yapmak için kullanılabilir.

Django'da middleware nerede kullanılır?

Projenin genelindeki tüm view fonksiyonları veya API uç noktaları(endpoints) için uygulanır. Projedeki her bir view veya API endpointe etki eder.

Middleware ne zaman çalıştırılır?

View fonksiyonu çağrılmadan önce ve sonra çalıştırılır. View fonksiyonundan önceki kodlar, isteğin view fonksiyonuna ulaşması öncesinde çalışır ve varsa request(istek) üzerinde manipülasyon yapılır.

View fonksiyonu işlendikten ve yanıt döndürüldükten sonra ise middleware'de bulunan sonraki kodlar çalışır.

Django'da middleware nasıl çalışır?

Adım 1:

Middleware fonksiyonunu tanımlama: middleware fonksiyonu, get_response parametresini alan ve gerçek middleware fonksiyonunu döndüren bir Python fonksiyonudur. get_response parametresi, bir request alan ve bir response döndüren bir fonksiyondur.

Adım 2:

Middleware mantığını uygulama: middleware fonksiyonu içinde, view fonksiyonundan önce ve sonra çalışan kodları yazabilirsiniz. Bu, isteği değiştirmek, yanıtı işlemek, log kaydetmek, kimlik doğrulama yapmak (authentication) veya başka özel işlemler gerçekleştirmek gibi görevleri içerebilir.

Adım 3:

Middleware kaydetme: Middleware kullanmak için, Django projesinin ayar dosyası (settings.py) içindeki MIDDLEWARE listesine kendi middleware'inizi eklemeniz gerekmektedir. Middleware sırası önemlidir, çünkü sıralı olarak çalışırlar.

Örnek senaryo - E-ticaret projesi:

Diyelim ki Django kullanarak bir e-ticaret web sitesi geliştiriyorsunuz. Her isteği kaydetmek ve kullanıcı aktivitesini takip etmek için bir middleware eklemek istiyorsunuz.

Adım 1: Middleware fonksiyonunu tanımlama:

def request_logger_middleware(get_response):
    def middleware(request):
        # İsteği kaydetmek için kodlar

        # Kullanıcı aktivite loglama
        log_user_activity(request)

        response = get_response(request)
        # Yanıtı kaydetmek için kodlar
        return response
    return middleware

Adım 2: Middleware mantığını uygulama:

Yukarıdaki kodda, get_response çağrısından önce isteği kaydetmek için kodu, get_response çağrısından sonra ise yanıtı kaydetmek için kodu yerleştirebilirsiniz.

Middleware içerisinde çağırılan log_user_activity fonksiyonunu da aşağıdaki gibi tanımlayabilirsiniz

def log_user_activity(request):
    user = request.user
    ip_address = request.META.get('REMOTE_ADDR')
    url = request.path
    timestamp = datetime.now()

    # Kullanıcı aktivitesini bir dosyaya, veritabanına veya başka bir yere kaydedebilirsiniz.
    log_entry = f"User: {user}, IP: {ip_address}, URL: {url}, Timestamp: {timestamp}\n"

    with open('activity.log', 'a') as file:
        file.write(log_entry)

Adım 3: Middleware'i settings'e kaydetme:

settings.py dosyanızda, kendi middleware fonksiyonunuzu MIDDLEWARE ayarına ekleyin:

MIDDLEWARE = [
    # Diğer orta yazılımlar
    'myapp.middleware.request_logger_middleware',
    # Diğer orta yazılımlar
]
- Bu kadar! Artık e-ticaret web sitenize yapılan her istek, uyguladığınız middleware tarafından kaydedilecektir.

Django'da middleware tanımlamayı bir class(sınıf) ile de yapabilirsiniz. Aşağıda bir örnek sınıf tanımlaması yapılmıştır.

class SimpleMiddleware:
     def __init__(self, get_response):
         self.get_response = get_response
         # Tek seferlik yapılandırma ve başlatma.

     def __call__(self, request):
         # Daha önce her istek için yürütülecek kod
         # view (ve daha sonra middleware) çağrılır.

         response = self.get_response(request)

         # Sonraki her istek/yanıt için yürütülecek kod
         # view çağrılır.

         return response
- settings.py dosyasında sınıfın ismi ile kaydetmeniz yeterlidir.
MIDDLEWARE = [
    # Diğer orta yazılımlar
    'myapp.middleware.SimpleMiddleware',
    # Diğer orta yazılımlar
]
- Django web uygulamanızda özel middleware'lerinizi uygulayabileceğiniz 10 farklı senaryo:

  1. Kimlik Doğrulama Middleware'i: İstekleri işlemeye başlamadan önce, belirli bir kullanıcının veya IP adresinin kimlik doğrulama mantığını kontrol etmek için özel bir middleware oluşturun.

  2. Oran Sınırlama Middleware'i: Belirli bir IP adresinden veya kullanıcıdan gelen isteklerin dakikada kaç adet olabileceğini sınırlayan bir middleware oluşturarak, kötüye kullanımı veya yetkisiz erişimi önleyin.

  3. Loglama Middleware'i: İstekleri takip etmek ve hata ayıklama amacıyla gelen isteklerin yönlendirme yöntemi, URL'si, başlıkları ve yanıt durumu gibi bilgilerini kaydetmek için bir middleware oluşturun.

  4. Hata İşleme Middleware'i: İstek işleme sırasında ortaya çıkan istisnaları veya hataları yakalayan ve işleyen bir middleware geliştirin. Bu sayede, tutarlı bir hata yanıtı formatı sağlayabilir veya özel bir hata sayfasına yönlendirebilirsiniz.

  5. API Anahtarı Middleware'i: İsteklerdeki API anahtarlarını doğrulamak için bir middleware oluşturun. Bu sayede, yalnızca yetkili istemcilerin belirli API noktalarına erişebilmesini sağlayabilirsiniz.

  6. CORS Middleware'i: Farklı etki alanlarından veya kaynaklardan API'nize erişimi sınırlayan veya etkinleştiren CORS başlıklarını işlemek için bir middleware oluşturun.

  7. İstek Süresi Middleware'i: Her bir isteği işlemek için geçen süreyi hesaplayan ve kaydeden bir middleware oluşturun. Bu, performans darboğazlarını belirlemenize ve uygulamanızı optimize etmenize yardımcı olur.

  8. Bakım Modu Middleware'i: Uygulamanın bakım modunda olup olmadığını kontrol eden bir middleware oluşturun. Böylece tüm istekleri bakım sayfasına yönlendirebilir veya özel bir mesaj gösterebilirsiniz.

  9. Sıkıştırma Middleware'i: Yanıt içeriğini (örneğin gzip kullanarak) sıkıştırarak bant genişliğini azaltan ve uygulamanın genel performansını artıran bir middleware oluşturun.

  10. Özel Başlık Middleware'i: İsteğe veya yanıta belirli başlıklar eklemek veya değiştirmek için bir middleware oluşturun. Örneğin, güvenlikle ilgili başlıkları ayarlamak veya önbelleğe alma davranışını özelleştirmek gibi.

Bu senaryolar, Django'da özel middleware'lerin esnekliğini ve çok yönlülüğünü göstermektedir. Böylece farklı işlevleri uygulayabilir ve istek/yanıt işleme sürecini uygulamanızın özel gereksinimlerine göre özelleştirebilirsiniz.

Umarım bu yazı, Django'da ara katman yazılımı (middleware) kavramını anlamanıza yardımcı olur. Bu, projenizdeki tüm istekler ve yanıtlar üzerinde genel/global olarak işlemler yapmanıza olanak sağlayan güçlü bir özelliktir.