L’API est construite avec Django REST Framework (apps/api/). Le schéma OpenAPI est généré par drf-spectacular ; Swagger UI est servi localement (drf-spectacular-sidecar), sans CDN.
| URL |
Contenu |
/api/docs/ |
Documentation interactive (Swagger UI) |
/api/schema/ |
Schéma OpenAPI 3 |
/api/v1/ |
Racine de l’API navigable |
| Point d’accès |
Méthodes |
Accès |
/api/v1/recipes/, /api/v1/recipes/{slug}/ |
GET |
public |
/api/v1/recipes/{slug}/estimate/?servings=&lat=&lon=&radius_km= |
GET |
public |
/api/v1/ingredients/, /api/v1/ingredients/{slug}/ |
GET |
public |
/api/v1/pantry/ |
GET, POST, PUT, PATCH, DELETE |
authentifié, propre à l’utilisateur |
/api/v1/shopping-lists/ |
GET, POST, PUT, PATCH, DELETE |
authentifié |
/api/v1/shopping-lists/{id}/add-recipe/ |
POST |
authentifié |
/api/v1/shopping-items/{id}/ |
PUT, PATCH, DELETE |
authentifié |
/api/v1/products/{code-barres}/ |
GET |
authentifié |
- La liste des recettes accepte les mêmes paramètres que la page web (
q, course, diet, difficulty, max_minutes, sort), grâce au même RecipeFilterForm.
estimate limite servings entre 1 et 30 et radius_km à 100, puis applique estimate_near() : voir Prix et métriques.
add-recipe attend recipe (slug), servings et use_pantry, et réutilise shopping.services.add_recipe.
products interroge Open Food Facts et renvoie 404 si le produit est inconnu ou si le service est indisponible.
- Session Django (navigateur) ou jeton :
Authorization: Token <clé>. Les jetons se créent dans l’administration (rest_framework.authtoken).
- Permission par défaut : lecture publique, écriture authentifiée (
IsAuthenticatedOrReadOnly).
- Les ressources personnelles héritent de
OwnedMixin : le QuerySet est filtré sur request.user et perform_create rattache l’objet à l’utilisateur. Un utilisateur ne peut ni lire ni modifier les données d’un autre, ce que vérifient les tests de apps/api/tests/.
- Pagination par numéro de page, 20 éléments par page (
?page=2), avec count, next et previous.
- Limitation de débit : 60 requêtes par minute en anonyme, 240 par minute authentifié.
- Écrire le sérialiseur dans
apps/api/serializers.py.
- Écrire le ViewSet dans
apps/api/views.py, en réutilisant les services métier plutôt qu’en dupliquant la logique. Pour une ressource personnelle, hériter de OwnedMixin et définir model.
- Documenter les paramètres non déduits automatiquement avec
@extend_schema.
- Enregistrer le ViewSet dans le routeur de
apps/api/urls.py.
- Tester l’accès anonyme, l’accès authentifié et l’isolation entre utilisateurs.