Middleware einrichten

Middleware sind Aktionen, die zwischen dem server- und clientseitigen Request-Response-Zyklus stattfinden. Im Wesentlichen handelt es sich nur um Funktionen, die ausgeführt werden, wenn eine Anfrage vom Server empfangen wird oder bevor sie zum Client zurückgesendet wird. Sie sind nützlich bei Aktionen oder Überprüfungen, die bei (fast) allen Anfragen bzw. Antworten durchzuführen sind.

Beispiele für Middlewares

Beispiele sind die User-Authentizierung (durch die django.contrib.auth.middleware.AuthenticationMiddleware) oder der Schutz vor CSRF durch die django.middleware.csrf.CsrfViewMiddleware.

Diese Middlewares sind von Django gegeben und wir müssen sie nur in den settings.py registrieren. Wir können aber problemlos auch unsere eigene Middleware schreiben.

Performance Counter Middleware

Wir schreiben eine eigene PerfCountMiddleware, die die Zeit zwischen Request und Response messen soll. Wir legen die Datei event_manager/middleware.py an und fügen folgenden Inhalt ein:

from time import perf_counter

class PerfCountMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        print("Initializing Middleware")

    def __call__(self, request):
        # Code to be executed for each request before
        start = perf_counter()
        response = self.get_response(request)
        end = perf_counter()
        print(f"Die Operation hat: {end - start:.2f} Sekunden gedauert")

        return response

Intermezzo: Die __call__Methode

__call__ bewirkt, dass eine Instanz der Klasse aufrufbar ist. Die __call__ methode in Django middleware Klassen wir bei jedem Applikations-Request aufgerufen.

class Student:
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print(f"{self.name} was called")

x = Student("Harry Potter")
x()

Settings

In den Settings wollen wir die Middleware jetzt aktivieren. Wir öffnen die event_manager/settings/dev.py und fügen folgendes ein:

MIDDLEWARE.extend(
    [
        "debug_toolbar.middleware.DebugToolbarMiddleware",
        "event_manager.middleware.PerfCountMiddleware",
    ]
)

Add Date Middleware

Wir können auch den Context manipulieren, mit dem das Template gerendert wird. Dazu schreiben wir noch eine Middleware und fügen sie in event_manager/middleware.py ein. Wichtig ist hier die Methode process_template_response, die wir überschreiben.

from django.utils import timezone

class AddDateMiddleware:
    """Add current timestamp to the global context dictionary."
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_template_response(self, request, response):
        response.context_data['current_date'] = timezone.now()
        return response

Settings

In den Settings wollen wir die Middleware jetzt wieder aktivieren. Wir öffnen die event_manager/settings/dev.py und fügen folgendes ein:

MIDDLEWARE.extend(
    [
        "debug_toolbar.middleware.DebugToolbarMiddleware",
        "event_manager.middleware.PerfCountMiddleware",
        "event_manager.middleware.AddDateMiddleware",
    ]
)

Template

Im Template unter event_manager/templates/base.html fügen wir jetzt noch eine Datumsvariable ein:

{{current_date}}

Mehr Infos zur Middleware gibt es hier: