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

Django REST Framework

Django REST Framework (DRF) e’ un toolkit potente e flessibile per costruire API Web con Django. Fornisce strumenti come serializzatori, view, autenticazione e una browsable API che semplificano enormemente lo sviluppo di API RESTful.

Installazione e Configurazione

Per iniziare con DRF, installalo e aggiungilo alle applicazioni del progetto Django.

# Installazione
# pip install djangorestframework
# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # Aggiungi DRF
    'miaapp',
]

Configurazione Globale REST_FRAMEWORK

DRF offre un dizionario di configurazione globale nel file settings.py per personalizzare il comportamento predefinito delle API.

# settings.py
REST_FRAMEWORK = {
    # Classi di autenticazione predefinite
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    # Classi di permessi predefinite
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    # Paginazione predefinita
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20,
    # Renderer predefiniti
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

Cos’e’ la Browsable API

Una delle caratteristiche distintive di DRF e’ la Browsable API: un’interfaccia web interattiva che permette di esplorare e testare le API direttamente dal browser. Viene abilitata automaticamente quando BrowsableAPIRenderer e’ incluso nei renderer.

Il Decoratore @api_view

Per le view basate su funzione, DRF fornisce il decoratore @api_view che aggiunge le funzionalita’ DRF alla view.

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

@api_view(['GET', 'POST'])
def lista_libri(request):
    if request.method == 'GET':
        libri = Libro.objects.all()
        serializer = LibroSerializer(libri, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = LibroSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Il decoratore @api_view accetta una lista dei metodi HTTP supportati e fornisce automaticamente la gestione dei content type, la negoziazione del formato e l’oggetto Response.

La Classe APIView

Per le view basate su classe, DRF offre APIView, che estende la View di Django con funzionalita’ specifiche per le API.

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class LibroListView(APIView):
    def get(self, request):
        libri = Libro.objects.all()
        serializer = LibroSerializer(libri, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = LibroSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class LibroDetailView(APIView):
    def get(self, request, pk):
        try:
            libro = Libro.objects.get(pk=pk)
        except Libro.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = LibroSerializer(libro)
        return Response(serializer.data)

    def put(self, request, pk):
        libro = Libro.objects.get(pk=pk)
        serializer = LibroSerializer(libro, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        libro = Libro.objects.get(pk=pk)
        libro.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

L’Oggetto Response

L’oggetto Response di DRF gestisce automaticamente la serializzazione dei dati nel formato richiesto dal client (JSON, HTML per la browsable API, ecc.).

from rest_framework.response import Response
from rest_framework import status

# Risposta con dati e codice di stato
return Response({'messaggio': 'Operazione completata'}, status=status.HTTP_200_OK)

# Risposta vuota con codice 204
return Response(status=status.HTTP_204_NO_CONTENT)

# Risposta con header personalizzati
response = Response(dati)
response['X-Custom-Header'] = 'valore'
return response

Configurazione delle URL

Le view DRF si collegano alle URL come qualsiasi view Django:

# urls.py
from django.urls import path
from .views import lista_libri, LibroListView, LibroDetailView

urlpatterns = [
    # View basata su funzione
    path('api/libri-fn/', lista_libri, name='lista-libri-fn'),
    # View basate su classe
    path('api/libri/', LibroListView.as_view(), name='lista-libri'),
    path('api/libri/<int:pk>/', LibroDetailView.as_view(), name='dettaglio-libro'),
]

Conclusione

Django REST Framework e’ uno strumento indispensabile per costruire API RESTful con Django. Grazie alla sua architettura modulare, alla browsable API integrata e ai numerosi strumenti disponibili come APIView, @api_view e l’oggetto Response, DRF rende lo sviluppo di API web efficiente e strutturato. La configurazione globale tramite REST_FRAMEWORK permette di centralizzare le impostazioni e mantenere coerenza in tutto il progetto.