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
