Introducció

El middleware en Django és una part fonamental del procés de petició-resposta. És una capa intermèdia que permet processar les peticions abans que arribin a les vistes i les respostes abans que siguin enviades al client. El middleware pot ser utilitzat per a diverses tasques, com ara l'autenticació, la gestió de sessions, la compressió de respostes, la protecció contra atacs CSRF, entre d'altres.

Conceptes Clau

  • Middleware: Una funció o classe que processa les peticions i respostes.
  • Cadena de Middleware: Una seqüència de middleware que s'executa en ordre.
  • Request Middleware: Processa les peticions abans que arribin a les vistes.
  • Response Middleware: Processa les respostes abans que siguin enviades al client.

Configuració del Middleware

El middleware es configura a l'arxiu settings.py del projecte Django. La configuració es fa mitjançant la variable MIDDLEWARE, que és una llista de cadenes de text que representen les classes de middleware.

# settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Creació d'un Middleware Personalitzat

Per crear un middleware personalitzat, has de definir una classe amb dos mètodes: __init__ i __call__. A continuació es mostra un exemple de middleware que afegeix una capçalera personalitzada a cada resposta.

# myapp/middleware.py

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

    def __call__(self, request):
        # Processament de la petició abans de la vista
        response = self.get_response(request)
        # Processament de la resposta abans d'enviar-la al client
        response['X-Custom-Header'] = 'My Custom Header'
        return response

Després de definir el middleware, has d'afegir-lo a la llista MIDDLEWARE en settings.py.

# settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'myapp.middleware.CustomHeaderMiddleware',  # Afegir el middleware personalitzat aquí
]

Tipus de Middleware

Middleware de Petició

El middleware de petició processa les peticions abans que arribin a les vistes. Per crear un middleware de petició, has de definir el mètode process_request.

# myapp/middleware.py

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

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

    def process_request(self, request):
        print(f"Request Method: {request.method}")
        print(f"Request Path: {request.path}")

Middleware de Resposta

El middleware de resposta processa les respostes abans que siguin enviades al client. Per crear un middleware de resposta, has de definir el mètode process_response.

# myapp/middleware.py

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

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

    def process_response(self, request, response):
        print(f"Response Status Code: {response.status_code}")
        return response

Exercicis Pràctics

Exercici 1: Middleware de Comptatge de Peticions

Crea un middleware que compti el nombre de peticions fetes al servidor i imprimeixi aquest nombre a la consola.

Solució

# myapp/middleware.py

class RequestCountMiddleware:
    request_count = 0

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

    def __call__(self, request):
        RequestCountMiddleware.request_count += 1
        print(f"Total Requests: {RequestCountMiddleware.request_count}")
        response = self.get_response(request)
        return response

Exercici 2: Middleware de Capçalera Personalitzada

Crea un middleware que afegeixi una capçalera personalitzada X-Developer amb el valor Your Name a cada resposta.

Solució

# myapp/middleware.py

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

    def __call__(self, request):
        response = self.get_response(request)
        response['X-Developer'] = 'Your Name'
        return response

Errors Comuns i Consells

  • Ordre del Middleware: L'ordre en què es defineixen els middleware a la llista MIDDLEWARE és important. Alguns middleware depenen d'altres per funcionar correctament.
  • No oblidar cridar get_response: Assegura't de cridar self.get_response(request) dins del mètode __call__ per permetre que la petició continuï a través de la cadena de middleware.
  • Depuració: Utilitza print o eines de depuració per verificar que el middleware està funcionant com s'espera.

Conclusió

El middleware és una eina poderosa en Django que permet processar peticions i respostes de manera flexible i eficient. Amb el coneixement adquirit en aquesta secció, ara pots crear i configurar middleware personalitzat per satisfer les necessitats específiques de la teva aplicació.

En el següent tema, explorarem la càrrega de fitxers en Django, una funcionalitat essencial per a moltes aplicacions web.

© Copyright 2024. Tots els drets reservats