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}}