Création d'API RESTful dans Django avec Django REST Framework

Django REST Framework (DRF) est une boîte à outils puissante et flexible pour la création d'API Web. Elle simplifie le processus de création d'API RESTful, en fournissant des fonctionnalités telles que des sérialiseurs, des ensembles de vues et des mécanismes d'authentification prêts à l'emploi.

Configuration du framework Django REST

Avant de pouvoir créer une API RESTful, vous devez installer Django REST Framework et l'ajouter à votre projet. Exécutez la commande suivante pour installer DRF:

pip install djangorestframework

Ensuite, ajoutez 'rest_framework' à INSTALLED_APPS dans votre fichier settings.py:

INSTALLED_APPS = [
    ...,
    'rest_framework',
]

Créer une API simple

Créons une API pour un modèle simple appelé Book. La première étape consiste à définir le modèle dans models.py:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    published_date = models.DateField()
    isbn = models.CharField(max_length=13)

    def __str__(self):
        return self.title

Après avoir défini le modèle, exécutez les migrations pour créer la table de base de données:

python manage.py makemigrations
python manage.py migrate

Créer un sérialiseur

Les sérialiseurs dans DRF convertissent les types de données complexes comme les modèles Django en JSON. Créez un sérialiseur pour le modèle Book:

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

Vues et URL du bâtiment

DRF propose deux méthodes principales pour créer des vues API: les vues basées sur les fonctions et les vues basées sur les classes. Ici, nous utilisons des vues basées sur les classes avec APIView:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Book
from .serializers import BookSerializer

class BookListCreateAPIView(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = BookSerializer(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)

Ensuite, configurez les URL pour cette vue dans urls.py:

from django.urls import path
from .views import BookListCreateAPIView

urlpatterns = [
    path('books/', BookListCreateAPIView.as_view(), name='book-list-create'),
]

Tester l'API

Une fois le serveur en cours d'exécution, vous pouvez tester l'API à l'adresse http://127.0.0.1:8000/books/ à l'aide d'outils tels que Postman ou curl. Une requête GET récupère tous les livres et une requête POST vous permet de créer un nouveau livre.

Améliorer l'API avec ViewSets

Pour un code plus concis et réutilisable, vous pouvez utiliser ViewSet et Router de DRF. Voici comment mettre à jour l'API pour utiliser un ModelViewSet:

from rest_framework.viewsets import ModelViewSet
from .models import Book
from .serializers import BookSerializer

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

Ensuite, configurez le routeur dans urls.py:

from rest_framework.routers import DefaultRouter
from .views import BookViewSet

router = DefaultRouter()
router.register(r'books', BookViewSet, basename='book')

urlpatterns = router.urls

Conclusion

Django REST Framework simplifie la création d'API RESTful robustes et flexibles. En utilisant des sérialiseurs, des vues et des routeurs, vous pouvez créer des API qui gèrent facilement des modèles de données complexes. Grâce à cette base, vous pouvez désormais explorer des fonctionnalités avancées telles que les autorisations personnalisées, la pagination et l'authentification dans DRF.