Django Middleware Nasıl Yazılır ?

Merhabalar, Django projesi yazarken bir kodu tekrar tekrar tüm api’ler için yazmamız gerekebilir veya biz öyle düşünebiliriz tüm api’ler için ortak olan kodu tek bir yere yazıp ara katman olarak çağırmaya ne dersiniz ?

Middleware (Ara katman) Nedir ?

Middleware’i kısaca gönderdiğimiz isteğin isleme alınmasından önce ve isleme alınmasından sonra çalıştırılması istenen kodlar bütünü olarak tanımlayabiliriz.

Django ‘da ön tanımlı olarak gelen bir çok Middleware var bunları uygulamamızın isteğine göre aktif edebiliyoruz. (SessionMiddleware, AuthenticationMiddleware vb.)

Django Middleware | Furkan Ozkaya

Middleware yazalım:

Öncelikle projeyi oluşturalım basit bir rest api oluşturacağız.

django-admin startproject MiddlewareExample
python manage.py startapp example

INSTALLED_APPS ve URL ayarlarını yaptıktan sonra basit bir api yazalım.

hello_world adında bir api yazalım ve test edelim.

Şimdi Middleware yazmak için hazırız.

def example_middleware(get_response):
    def middleware(request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        print("Istek oncesi calisan kod parcacigi")
        response = get_response(request)
        print("Istek sonrasi calisan kod parcacigi")
        # Code to be executed for each request/response after
        # the view is called.
        return response

    return middleware

App içerisinde middleware klasörü açıp example_middleware.py dosyasına yukarıdaki kod parçacıgını yazalım.

Kod parçacığından da anlaşılacağı gibi istek view’e gönderilmeden önce ve sonrasında işlemler yapabiliyoruz.

Yazdığımız middleware’in yolunu settings dosyasındaki middleware dizisine ekliyoruz.

İstek attığımızda, istekten öncesi, istek ve istek sonrası olarak çıktımızı göreceğiz. Gerçek bir örnek ile middleware kavramını pekiştirelim.

Apilerin kaç saniyede cevap verdiğini hesaplayan kodu yazalım.

from datetime import datetime

def measure_time(get_response):

    def middleware(request):
        start = datetime.now()
        response = get_response(request)
        end = datetime.now()
        elapsed_time = end - start

        print(
            f"Request {elapsed_time.total_seconds()} saniyede tamamlandi")

        return response

    return middleware

Class seklinde Middleware yazmak (Measure time örneği)

class MeasureTime():
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        start = datetime.now()
        response = self.get_response(request)
        end = datetime.now()
        elapsed_time = end - start

        print(f"Request {elapsed_time.total_seconds()} saniyede tamamlandi")

        return response

Yukarıdaki kodu incelediğinizde fonksiyona çok benzediğini göreceksiniz. __call__ methodu class cagirildiginda çalıştığından dolayı get_response adında view alan bir fonksiyon gibi görülebilir. Ayni işlevi gerçekleştirdiğini deneyimleyerek görebilirsiniz.

Django Özel middleware methodlari sunmaktadır bunları kullanabilmek için class seklinde tanımlamalıyız.

Middleware Methodlari

  • process_view(request, view_func, view_args, view_kwargs ): Method view çağırılmadan hemen önce çalışır.
  • process_exception(request, exception): Method View ‘da hata çıktığında çağırılır.
  • process_template_response(request,response): Method View çalıştırıldıktan hemen sonra çağırılır.
class MeasureTime():
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        start = datetime.now()
        response = self.get_response(request)
        end = datetime.now()
        elapsed_time = end - start

        print(f"Request {elapsed_time.total_seconds()} saniyede tamamlandi")

        return response

    def process_exception(self, request, exception):
        print(f"ERROR  ========> {exception}")
        return None

process_exception kullandigimizdan dolayi view’da herhangi bir hata olduğunda bu method tetiklenecek ve işlemlerimizi gerçekleştirecek.

Kaynaklar:

Django Middleware Dokumantasyonu

Add a Comment

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir