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 responseDespré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 responseExercicis 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 responseExercici 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 responseErrors 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 cridarself.get_response(request)dins del mètode__call__per permetre que la petició continuï a través de la cadena de middleware. - Depuració: Utilitza 
printo 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.
Curs de Desenvolupament Web amb Django
Mòdul 1: Introducció a Django
- Què és Django?
 - Configuració de l'Entorn de Desenvolupament
 - Creació del teu Primer Projecte Django
 - Comprensió de l'Estructura del Projecte Django
 
Mòdul 2: Conceptes Bàsics de Django
- Aplicacions Django i Estructura del Projecte
 - Enrutament d'URL i Vistes
 - Plantilles i Fitxers Estàtics
 - Models i Bases de Dades
 - Interfície d'Administració de Django
 
Mòdul 3: Django Intermedi
Mòdul 4: Django Avançat
- Consultes Avançades amb Django ORM
 - Models d'Usuari Personalitzats
 - Senyalitzacions de Django
 - Proves en Django
 - Optimització del Rendiment
 
