Après des mois de travail passés sur un projet data (tel un algorithme de machine learning, par exemple), vous arrivez à obtenir des résultats intéressants. Vous et votre hiérarchie souhaitez donc passer à la phase déploiement.
Pour ce faire, une approche très classique est de développer une API dédiée intégrant le travail que vous avez effectué.
Dans cet article, nous allons voir quel outil utiliser pour développer une API adaptée à un projet data et comment s’en servir.
Combo Python et FastAPI
Plusieurs langages informatiques sont utilisés en data science. Certains sont très spécialisés, comme R, d’autres plus généralistes, comme Python ou Java.
Cependant, Python reste LE langage de programmation le plus utilisé dans ce domaine et présente l’avantage d’être très versatile : il permet aussi bien de mener des analyses de données que de développer des applications.
C’est donc le choix naturel lorsque l’on souhaite développer une API pour un projet data. De plus, de nombreuses librairies externes ont été développées par la communauté Python à cet effet.
Parmi elles, deux retiennent particulièrement l’attention : Flask et FastAPI.
Ce sont deux librairies conçues pour le développement d’applications web. De ces deux options, nous vous recommandons vivement FastAPI pour les raisons suivantes :
- librairie conçue spécialement pour développer des API,
- génère automatiquement la documentation de votre API,
- rapide (comme son nom l’indique),
- FastAPI est plus haut niveau que Flask, donc vous aurez moins de code à écrire et la prise en main sera plus aisée,
- une documentation riche et une communauté en forte expansion..
Malgré tout, Flask reste une alternative très intéressante, notamment car c’est un projet plus ancien.
Il existe donc tout un écosystème de librairies utiles et complémentaires à Flask ; de plus, vous n’aurez aucun mal à trouver de l’aide sur internet.
Guide de démarrage de FastAPI
Pour illustrer la simplicité et l’efficacité d’utilisation de FastAPI, voici un guide qui vous permettra de créer une application simple mais fonctionnelle, s’exécutant en local.
Tout d’abord, pour installer FastAPI, exécutez dans votre terminal :
Créer des routes pour votre API
Ensuite, créez un répertoire où vous souhaitez stocker votre code. Dans ce répertoire, créez un fichier main.py et mettez-y le code suivant :
Explications :
- Tout d’abord, on importe FastAPI et on crée une instance de l’application que l’on stocke dans la variable app
- Ensuite, avec le décorateur @app on déclare une route. Dans ce cas, la route est valide pour la méthode HTTP GET et a pour cible l’URI racine (d’où l’argument "/")
- Enfin, on définit une fonction def root() qui sera exécutée lorsqu’une requête sera envoyée à l’API sur cette route. La valeur retournée par cette fonction sera envoyée comme réponse.
NB 1 : par défaut, la valeur retournée par la fonction sera convertie au format JSON par FastAPI, avant d’être envoyée comme réponse à la requête HTTP.
NB 2 : FastAPI supporte le code asynchrone. Si vous êtes familier avec les mots-clés async et await, vous pouvez les utiliser dans votre code.
À partir de là, on a déjà une version minimale et fonctionnelle. Vous pouvez lancer votre API en exécutant la commande suivante dans votre terminal (depuis le répertoire où se trouve main.py) :
Votre API tourne maintenant en local et vous pouvez y accéder dans votre navigateur via l’URL http://127.0.0.1:8000/
Explications :
- FastAPI se base sur uvicorn pour la partie web, donc on utilise cette commande pour lancer l’API.
- L’argument suivant indique à uvicorn d’aller chercher dans le fichier main la variable nommée app pour trouver l’instance à exécuter.
- Enfin, --reload signifie que les changements appliqués au code seront détectés automatiquement, pour ne pas avoir à relancer l’API à chaque changement.
Déclarer des paramètres pour les routes de votre API
Vous pouvez créer des routes avec des paramètres :
Les deux routes ci-dessus sont équivalentes, les arguments sont simplement déclarés différemment.
Bien sûr, vous pouvez déclarer plusieurs arguments pour la même route et combiner les deux méthodes précédentes, par exemple :
Définir des modèles et utiliser la validation automatique
Si vous souhaitez utiliser des paramètres d’entrée plus complexes, il est préférable d’utiliser la méthode HTTP POST et optionnellement, de déclarer un modèle pydantic dédié, comme ci-dessous :
Explications :
- La classe Item représente une structure pour des paramètres d’entrée.
- On définit une route valide pour la méthode HTTP POST et accessible via l’URI "/items/".
- Ensuite on passe comme argument à cette route item, qui doit être une instance de la classe Item.
Cela indique à FastAPI qu’une requête vers cette route doit contenir les informations telles que définies dans la classe Item. FastAPI s’occupe de vérifier et de valider la requête. Si la structure n’est pas respectée, FastAPI enverra automatiquement un message d’erreur sans que vous n’ayez à le coder.
NB 1 : notez le mot clé Optional dans la classe Item, cela veut dire que cette information peut être absente de la requête sans que FastAPI considère cela comme une erreur.
NB 2 : il existe des mécanismes de validation automatique similaires pour les paramètres déclarés avec la méthode HTTP GET.
Consulter la documentation de votre API générée dynamiquement
Enfin, cerise sur le gâteau, FastAPI génère automatiquement une documentation de votre API à partir de votre code. Cette documentation est accessible via l’URL : http://127.0.0.1:8000/docs
Pour que cette documentation soit la plus complète possible, vous avez tout intérêt à documenter votre code au maximum (docstring, typage…).
Comme vous pouvez le constater, nous avons réussi à développer une API fonctionnelle en quelques dizaines de lignes seulement. Bien sûr, la complexité de l’application dépendra aussi de votre projet, mais FastAPI rend très facile la partie purement API (à savoir, déclarer les routes, les paramètres d’entrée ou de sortie…).
Ce n’est là qu’un aperçu de toutes les possibilités offertes par FastAPI, vous trouverez de nombreux exemples supplémentaires dans la documentation (en anglais).