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.