Views Basate su Funzioni
Le views basate su funzioni (FBV - Function-Based Views) sono il modo più semplice e diretto per gestire le richieste HTTP in Django. Ogni view è una funzione Python che riceve un oggetto HttpRequest e restituisce un oggetto HttpResponse.
La View Più Semplice
Una view minima riceve una richiesta e restituisce una risposta:
from django.http import HttpResponse
def home(request):
return HttpResponse("Benvenuto nella home page!")
Per collegare questa view a una URL:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
]
Usare render() per i Template
La funzione render() combina un template HTML con un contesto di dati e restituisce un HttpResponse:
from django.shortcuts import render
def lista_articoli(request):
articoli = Articolo.objects.all()
contesto = {
'articoli': articoli,
'titolo': 'Tutti gli articoli',
}
return render(request, 'blog/lista.html', contesto)
render() accetta tre argomenti principali:
- request: L’oggetto richiesta HTTP.
- template_name: Il percorso del template.
- context: Un dizionario con i dati da passare al template.
JsonResponse per le API
Per restituire dati in formato JSON, usa JsonResponse:
from django.http import JsonResponse
def api_articoli(request):
dati = {
'articoli': [
{'id': 1, 'titolo': 'Primo articolo'},
{'id': 2, 'titolo': 'Secondo articolo'},
],
'totale': 2,
}
return JsonResponse(dati)
# Per liste, specifica safe=False
def api_lista(request):
lista = [1, 2, 3, 4, 5]
return JsonResponse(lista, safe=False)
Gestire GET e POST
Una view spesso deve comportarsi diversamente in base al metodo HTTP:
from django.shortcuts import render, redirect
def contatti(request):
if request.method == 'POST':
nome = request.POST.get('nome')
email = request.POST.get('email')
messaggio = request.POST.get('messaggio')
# Elabora i dati del form...
return redirect('conferma')
return render(request, 'contatti.html')
Per accedere ai parametri della query string nelle richieste GET:
def ricerca(request):
query = request.GET.get('q', '')
pagina = request.GET.get('pagina', 1)
risultati = Articolo.objects.filter(titolo__icontains=query)
return render(request, 'ricerca.html', {
'risultati': risultati,
'query': query,
})
Decoratori Utili
Django fornisce decoratori per aggiungere funzionalita alle views senza modificarne la logica:
from django.views.decorators.http import require_http_methods, require_GET, require_POST
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
# Limita i metodi HTTP consentiti
@require_http_methods(["GET", "POST"])
def contatti(request):
# Accetta solo GET e POST
pass
# Solo richieste GET
@require_GET
def informazioni(request):
return render(request, 'info.html')
# Solo richieste POST
@require_POST
def invia_form(request):
# Elabora il form
pass
# Richiede autenticazione
@login_required(login_url='/login/')
def profilo(request):
return render(request, 'profilo.html', {'utente': request.user})
Combinare Decoratori
I decoratori possono essere impilati per aggiungere piu livelli di logica:
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
@login_required
@require_POST
def elimina_articolo(request, pk):
articolo = Articolo.objects.get(pk=pk)
articolo.delete()
return redirect('blog:lista')
L’ordine conta: i decoratori vengono applicati dal basso verso l’alto. In questo caso, prima si verifica che la richiesta sia POST, poi che l’utente sia autenticato.
Views con Parametri URL
Le views ricevono i parametri definiti nelle URL come argomenti della funzione:
def dettaglio_articolo(request, slug):
articolo = Articolo.objects.get(slug=slug)
return render(request, 'blog/dettaglio.html', {'articolo': articolo})
def archivio(request, anno, mese):
articoli = Articolo.objects.filter(
data__year=anno,
data__month=mese,
)
return render(request, 'blog/archivio.html', {
'articoli': articoli,
'anno': anno,
'mese': mese,
})
Impostare il Codice di Stato HTTP
def pagina_non_trovata(request):
return render(request, '404.html', status=404)
def creato(request):
return HttpResponse("Risorsa creata", status=201)
Conclusione
Le views basate su funzioni sono ideali per logica semplice e diretta. Sono facili da leggere, testare e comprendere. I decoratori aggiungono funzionalita come controllo degli accessi e limitazione dei metodi HTTP senza appesantire il codice. Per logica piu complessa e ripetitiva, valuta le views basate su classi trattate nel prossimo capitolo.