Middleware
I middleware in Django sono componenti che si inseriscono nel ciclo di elaborazione delle richieste e delle risposte HTTP. Ogni middleware può modificare la richiesta prima che raggiunga la view, oppure modificare la risposta prima che venga inviata al client. Sono uno strumento potente per aggiungere logica trasversale allâintera applicazione.
Il Ciclo Richiesta/Risposta
Quando Django riceve una richiesta HTTP, questa attraversa tutti i middleware configurati dallâalto verso il basso. Una volta che la view ha prodotto una risposta, questa risale attraverso i middleware dal basso verso lâalto. Questo schema a âcipollaâ permette a ogni middleware di intervenire sia in ingresso che in uscita.
La Configurazione MIDDLEWARE
I middleware vengono configurati nella lista MIDDLEWARE nel file settings.py. Lâordine nella lista è fondamentale, poichĂŠ determina la sequenza di esecuzione.
# 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',
]
Scrivere un Middleware Personalizzato
Un middleware personalizzato in Django 5.x si scrive come una classe con i metodi __init__ e __call__. Il metodo __init__ viene chiamato una sola volta allâavvio del server, mentre __call__ viene invocato ad ogni richiesta.
class MioMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# Inizializzazione eseguita una sola volta
def __call__(self, request):
# Codice eseguito PRIMA della view
print(f"Richiesta in arrivo: {request.path}")
response = self.get_response(request)
# Codice eseguito DOPO la view
response['X-Custom-Header'] = 'MioValore'
return response
Per attivarlo, aggiungi il percorso completo alla lista MIDDLEWARE:
MIDDLEWARE = [
# ... altri middleware ...
'miaapp.middleware.MioMiddleware',
]
Hook Aggiuntivi
Oltre a __call__, un middleware puoâ definire metodi hook speciali per un controllo piuâ granulare.
process_view
Viene chiamato appena prima che Django esegua la view. Riceve la view, i suoi argomenti e i keyword arguments.
class ViewLoggerMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_view(self, request, view_func, view_args, view_kwargs):
print(f"View chiamata: {view_func.__name__}")
return None # None per continuare normalmente
process_exception
Viene chiamato quando una view solleva unâeccezione. Utile per la gestione centralizzata degli errori.
class GestoreEccezioniMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_exception(self, request, exception):
print(f"Errore nella view: {exception}")
return None # None per lasciare la gestione predefinita
process_template_response
Viene chiamato dopo la view se la risposta ha un metodo render(), come TemplateResponse. Permette di modificare il contesto del template prima del rendering finale.
class ContextMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_template_response(self, request, response):
response.context_data['info_extra'] = 'Aggiunto dal middleware'
return response
Middleware Built-in di Django
Django include diversi middleware pronti allâuso:
- SecurityMiddleware: gestisce redirect HTTPS e header di sicurezza
- SessionMiddleware: abilita il supporto alle sessioni
- CommonMiddleware: gestisce URL con trailing slash e header comuni
- CsrfViewMiddleware: protezione contro attacchi CSRF
- AuthenticationMiddleware: associa lâutente alla richiesta tramite
request.user - MessageMiddleware: abilita il framework dei messaggi
- XFrameOptionsMiddleware: protezione contro il clickjacking
Conclusione
I middleware sono uno strumento essenziale in Django per implementare logica che deve essere applicata trasversalmente a tutte le richieste. Dalla sicurezza al logging, dalla gestione delle sessioni alla modifica delle risposte, comprendere come funzionano e come crearne di personalizzati ti permette di costruire applicazioni web robuste e ben strutturate.