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

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.