Pourquoi FastAPI ?
FastAPI est un framework Python pour construire des API web. Il s’appuie sur les annotations de type de Python : à partir de la signature de tes fonctions, il valide les données entrantes, convertit les réponses en JSON et génère une documentation interactive. Il repose sur Starlette (la partie web) et Pydantic (la validation). Ce cours utilise FastAPI 0.162 et Pydantic 2.14 (Python 3.10 ou plus récent). C’est aujourd’hui l’un des choix les plus populaires pour les API Python, y compris pour servir des modèles de machine learning.
Installation
Dans un environnement virtuel :
python -m venv .venv
source .venv/bin/activate # Windows : .venv\Scripts\activate
pip install "fastapi[standard]" # dernière version : FastAPI + serveur Uvicorn + outils CLI
Une première application
# main.py
from fastapi import FastAPI
app = FastAPI(title="API Boutique", version="1.0.0") # l'objet application
@app.get("/") # opération de chemin : méthode GET sur "/"
def racine():
# Un dict renvoyé est automatiquement converti en JSON
return {"message": "Bienvenue sur l'API"}
@app.get("/sante")
def sante():
return {"statut": "ok"}
On lance le serveur de développement, qui se recharge à chaque modification :
fastapi dev main.py
# -> Serving at: http://127.0.0.1:8000
En production, on utilise fastapi run main.py (sans rechargement automatique). Teste ensuite :
curl http://127.0.0.1:8000/sante
# {"statut":"ok"}
La documentation automatique
Ouvre http://127.0.0.1:8000/docs : FastAPI génère une interface Swagger UI qui liste tes routes et permet de les essayer (« Try it out »). Une autre présentation est disponible sur /redoc. Les deux lisent le schéma OpenAPI exposé en JSON sur /openapi.json, un standard que d’autres outils savent exploiter (génération de clients, tests).
Que fait le décorateur ?
@app.get("/") enregistre la fonction racine dans la table de routage de l’application : « quand une requête GET arrive sur /, appelle cette fonction ». Le décorateur renvoie la fonction inchangée. À la réception d’une requête, FastAPI cherche la route correspondante :
- trouvée → il appelle la fonction et sérialise le résultat en JSON (statut 200 par défaut) ;
- chemin inconnu →
404avec{"detail": "Not Found"}; - chemin connu mais autre méthode (POST au lieu de GET) →
405 Method Not Allowed.
Il existe un décorateur par méthode HTTP : @app.get, @app.post, @app.put, @app.patch, @app.delete.
def ou async def ?
@app.get("/meteo")
async def meteo():
# async def est utile si l'on attend une opération asynchrone :
# données = await client_http.get(...)
return {"ciel": "dégagé"}
Si ta fonction n’utilise pas await (ou utilise des bibliothèques bloquantes classiques), écris simplement def : FastAPI l’exécute dans un pool de threads sans bloquer le serveur. Mettre async def puis appeler du code bloquant (requête SQL synchrone, time.sleep) bloquerait toutes les requêtes.
À retenir
app = FastAPI(), un décorateur par route, des fonctions qui renvoient des dict.fastapi devpour développer,/docspour explorer et tester.defpar défaut,async defquand tu utilisesawait.
Exercices
Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.
Un mini-routeur à décorateurs
Pour comprendre ce que fait
@app.get, implémente la classeMiniApp:routes: dictionnaire(méthode, chemin) -> fonction;get(chemin)etpost(chemin): décorateurs qui enregistrent la fonction et la renvoient inchangée ;appeler(methode, chemin): renvoie(200, json)avec le résultat sérialisé parjson.dumps(..., ensure_ascii=False),(404, '{"detail": "Not Found"}')si le chemin est inconnu,(405, '{"detail": "Method Not Allowed"}')si le chemin existe pour une autre méthode.
Crée ensuite
app = MiniApp()et deux routes GET :/renvoyant{"message": "Bienvenue sur l'API"}et/santerenvoyant{"statut": "ok"}.import json class MiniApp: def __init__(self): self.routes = {} def get(self, chemin): ... def post(self, chemin): ... def appeler(self, methode, chemin): ... app = MiniApp() # @app.get("/") ...Lancer sa première API FastAPI
Dans ton environnement de travail : crée un environnement virtuel, installe
fastapi[standard], écrismain.pyavec les routes/et/sante, puis lancefastapi dev main.py. Interroge l’API aveccurlet ouvre/docs. Ajoute enfin une route/versionqui renvoie{"version": "1.0.0"}et vérifie qu’elle apparaît dans la documentation sans redémarrer.- curl http://127.0.0.1:8000/sante renvoie {"statut":"ok"}
- La page /docs liste les trois routes
- La route /version apparaît après sauvegarde grâce au rechargement automatique
- curl sur une route inexistante renvoie {"detail":"Not Found"} avec le statut 404
Documentation automatique
Sur quelle URL FastAPI sert-il par défaut l’interface Swagger UI ?
- /swagger
- /docs
- /api
- /openapi
Quiz de fin de leçon
Que fait FastAPI d’un dict renvoyé par une fonction de route ?
- Il l'affiche en HTML
- Il le convertit en réponse JSON
- Il lève une erreur
Quelle commande lance le serveur de développement avec rechargement automatique ?
- fastapi dev main.py
- python main.py --reload
- fastapi run main.py
Quand faut-il utiliser async def ?
- Toujours, c'est plus rapide
- Quand la fonction utilise await sur des opérations asynchrones
- Jamais avec FastAPI
La suite du cours
- Paramètres de chemin et de requête18 min
- Corps de requête et modèles Pydantic20 min
- CRUD complet, erreurs HTTP et routeurs20 min
- Dépendances, base de données et tests20 min