.. _middlewares: 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: .. code-block:: python 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. .. code-block:: python 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: .. code-block:: python 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. .. code-block:: python 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: .. code-block:: python 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: .. code-block:: python {{current_date}} Mehr Infos zur Middleware gibt es hier: ........................................... * ``_ * ``_