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

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.