Salta al contenuto
Django

Request e Response

In Django, ogni interazione HTTP è gestita attraverso due oggetti fondamentali: HttpRequest, che rappresenta la richiesta in arrivo, e HttpResponse, che rappresenta la risposta inviata al client. Comprendere questi oggetti è essenziale per gestire correttamente il flusso dei dati.

L’Oggetto HttpRequest

Quando un utente effettua una richiesta, Django crea automaticamente un oggetto HttpRequest e lo passa come primo argomento alla view:

def mia_view(request):
    # request è un'istanza di HttpRequest
    print(type(request))  # <class 'django.http.HttpRequest'>
    return HttpResponse("OK")

Attributi Principali di HttpRequest

Metodo HTTP

def gestisci(request):
    if request.method == 'GET':
        # Logica per GET
        pass
    elif request.method == 'POST':
        # Logica per POST
        pass

Dati GET e POST

def ricerca(request):
    # Parametri della query string (?q=django&pagina=2)
    query = request.GET.get('q', '')
    pagina = request.GET.get('pagina', 1)

    # Dati inviati tramite form POST
    nome = request.POST.get('nome', '')
    email = request.POST.get('email', '')

File Caricati

def carica_file(request):
    if request.method == 'POST':
        file = request.FILES.get('documento')
        if file:
            nome = file.name
            dimensione = file.size
            tipo = file.content_type
            # Salva il file...

Headers della Richiesta

def mia_view(request):
    # Accesso agli headers (Django 4.0+)
    content_type = request.headers.get('Content-Type')
    auth = request.headers.get('Authorization')
    user_agent = request.headers.get('User-Agent')

    # Verificare se è una richiesta AJAX
    is_ajax = request.headers.get('X-Requested-With') == 'XMLHttpRequest'

Utente e Sessione

def profilo(request):
    # Utente autenticato (richiede django.contrib.auth)
    utente = request.user

    if request.user.is_authenticated:
        nome = request.user.username
        email = request.user.email

    # Sessione
    request.session['ultima_visita'] = '2026-02-06'
    visita = request.session.get('ultima_visita')

Altre Proprieta Utili

def info_request(request):
    percorso = request.path           # '/blog/articolo/1/'
    url_completo = request.get_full_path()  # '/blog/articolo/1/?ref=home'
    schema = request.scheme           # 'https'
    host = request.get_host()         # 'miosito.com'
    is_sicuro = request.is_secure()   # True se HTTPS
    ip_client = request.META.get('REMOTE_ADDR')

HttpResponse

HttpResponse è la classe base per tutte le risposte HTTP:

from django.http import HttpResponse

def mia_view(request):
    # Risposta semplice
    response = HttpResponse("Contenuto della pagina")

    # Impostare il codice di stato
    response = HttpResponse("Non trovato", status=404)

    # Impostare il content type
    response = HttpResponse(content_type='text/plain')
    response.write("Testo semplice")

    # Aggiungere headers personalizzati
    response['X-Custom-Header'] = 'valore'
    response['Cache-Control'] = 'no-cache'

    return response

JsonResponse

Per le API REST, JsonResponse serializza automaticamente i dati in JSON:

from django.http import JsonResponse

def api_dati(request):
    dati = {
        'stato': 'successo',
        'risultati': [
            {'id': 1, 'nome': 'Elemento 1'},
            {'id': 2, 'nome': 'Elemento 2'},
        ]
    }
    return JsonResponse(dati)

# Per inviare una lista come root element
def api_lista(request):
    return JsonResponse([1, 2, 3], safe=False)

# Specificare il codice di stato
def api_errore(request):
    return JsonResponse(
        {'errore': 'Non autorizzato'},
        status=401
    )

StreamingHttpResponse

Per risposte con contenuto di grandi dimensioni, usa StreamingHttpResponse per inviare i dati in streaming senza caricarli interamente in memoria:

from django.http import StreamingHttpResponse
import csv

def esporta_csv(request):
    def genera_righe():
        yield 'Nome,Email,Citta\n'
        for utente in Utente.objects.all().iterator():
            yield f'{utente.nome},{utente.email},{utente.citta}\n'

    response = StreamingHttpResponse(
        genera_righe(),
        content_type='text/csv'
    )
    response['Content-Disposition'] = 'attachment; filename="utenti.csv"'
    return response

FileResponse

FileResponse è ottimizzato per l’invio di file binari:

from django.http import FileResponse

def scarica_pdf(request):
    percorso = '/percorso/al/documento.pdf'
    return FileResponse(
        open(percorso, 'rb'),
        as_attachment=True,
        filename='documento.pdf'
    )

L’argomento as_attachment=True aggiunge l’header Content-Disposition, forzando il download del file invece della visualizzazione nel browser.

Conclusione

Gli oggetti HttpRequest e HttpResponse sono i pilastri della comunicazione HTTP in Django. HttpRequest fornisce accesso a tutti i dati della richiesta (metodo, parametri, headers, utente e sessione), mentre le varie classi di risposta (HttpResponse, JsonResponse, StreamingHttpResponse, FileResponse) coprono ogni esigenza di output, dalle pagine HTML alle API JSON fino al download di file.

Contenuto redatto con l'assistenza di strumenti di intelligenza artificiale e rivisto dalla redazione di Codegrind, che ne è responsabile. Hai trovato un errore? Scrivici.