Pourquoi API REST avec Django ?
L'API REST (Representational State Transfer) est un type d'architecture web qui permet aux systèmes d'échanger des données de manière standardisée et sécurisée. En tant que développeur Django, vous aurez souvent besoin de créer une API pour interagir avec d'autres applications ou services.
Un cas d'usage concret : Imaginez que vous développez une application mobile et que vous voulez afficher les articles d'un blog dans l'application. Pour ce faire, votre application mobile devra communiquer avec votre backend Django qui contient la logique du blog. C'est là qu'intervient l'API REST pour permettre cette communication sécurisée.
Prerequis
- Connaissances de base en Python et Django
- Connaissance des bases de données SQL
- Connexion à un environnement terminal (pour exécuter les commandes)
- Un éditeur de texte ou un IDE pour écrire le code
Concepts fondamentaux
- Views : Les views sont les "gardiens" des routes de votre API. Elles définissent comment une requête HTTP est traitée et quel type de réponse est renvoyé.
## Importer les bibliothèques nécessaires
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
@csrf_exempt
def article_list(request):
if request.method == 'GET':
articles = Article.objects.all()
data = [{'id': article.id, 'title': article.title} for article in articles]
return JsonResponse(data, safe=False)
- URLs : Les URLs définissent les routes de votre API et les views qui doivent être appelées pour chaque route.
## Définir les URL pour l'API
from django.urls import path
from .views import article_list
urlpatterns = [
path('articles/', article_list, name='article-list'),
]
- Models : Les models définissent la structure de votre base de données et permettent d'interagir avec elle.
## Définir le model pour les articles
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
- Serializers : Les serializers convertissent les objets Python en format JSON et vice versa.
## Importer les bibliothèques nécessaires
from rest_framework import serializers
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['id', 'title', 'content']
- Routers : Les routers simplifient la création des URL pour les vues d'API.
## Importer les bibliothèques nécessaires
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet
router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
urlpatterns += router.urls
Mise en pratique : projet fil rouge
Nous allons créer un mini-projet complet pour une API de blog. Ce projet comprendra les opérations CRUD (Create, Read, Update, Delete) pour les articles.
Étape 1 : Créer le modèle Article
## models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
Étape 2 : Créer le serializer ArticleSerializer
## serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['id', 'title', 'content', 'pub_date']
Étape 3 : Créer les vues et les routes ArticleViewSet
## views.py
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
django
## urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet
router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
urlpatterns = [
path('', include(router.urls)),
]
Étape 4 : Migrer la base de données et démarrer le serveur
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
Erreurs frequentes et debugging
La réponse n'est pas en format JSON
# ❌ Mauvais return HttpResponse(data) # ✅ Correct import json from django.http import JsonResponse return JsonResponse(data, safe=False)L'erreur 404 lors de l'accès à une route non trouvée
# ❌ Mauvais from django.urls import path from .views import article_list urlpatterns = [ path('articles/', article_list), ] # ✅ Correct from django.urls import path from .views import article_list, ArticleViewSet router = DefaultRouter() router.register(r'articles', ArticleViewSet) urlpatterns = [ path('', include(router.urls)), ]Le champ
pub_daten'est pas correctement affiché# ❌ Mauvais from rest_framework import serializers class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = ['id', 'title', 'content'] # ✅ Correct from rest_framework import serializers from .models import Article class ArticleSerializer(serializers.ModelSerializer): pub_date = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S') class Meta: model = Article fields = ['id', 'title', 'content', 'pub_date']
Pour aller plus loin
L'utilisation de Django REST Framework (DRF) : DRF est une bibliothèque complète pour créer des APIs avec Django.
La gestion des permissions et des droits d'accès : Apprenez à contrôler qui peut accéder aux différentes routes de votre API.
L'ajout de pagination et de filtrage : Améliorez vos vues pour gérer les grandes quantités de données et permettre des filtres avancés.
Défi pratique : Ajoutez une fonctionnalité d'upload d'images aux articles en utilisant Django REST Framework et le package django-storages.