00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.