.. _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:
...........................................
* ``_
* ``_