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.