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