Premiers pas avec FastAPI

Première leçon du cours API avec FastAPI, en accès libre : environ 15 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Installer FastAPI et lancer une application avec le serveur de développement
  • Déclarer des routes avec les décorateurs @app.get / @app.post
  • Explorer la documentation interactive générée automatiquement (OpenAPI)

Application FastAPIOpérations de chemin (routes)Documentation OpenAPI

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 → 404 avec {"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 dev pour développer, /docs pour explorer et tester.
  • def par défaut, async def quand tu utilises await.

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.

  1. CodeDifficulté 2Python dans le navigateur2 indices

    Un mini-routeur à décorateurs

    Pour comprendre ce que fait @app.get, implémente la classe MiniApp :

    • routes : dictionnaire (méthode, chemin) -> fonction ;
    • get(chemin) et post(chemin) : décorateurs qui enregistrent la fonction et la renvoient inchangée ;
    • appeler(methode, chemin) : renvoie (200, json) avec le résultat sérialisé par json.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 /sante renvoyant {"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("/") ...
  2. TâcheDifficulté 12 indices

    Lancer sa première API FastAPI

    Dans ton environnement de travail : crée un environnement virtuel, installe fastapi[standard], écris main.py avec les routes / et /sante, puis lance fastapi dev main.py. Interroge l’API avec curl et ouvre /docs. Ajoute enfin une route /version qui 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
  3. QCMDifficulté 11 indice

    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

  1. 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
  2. Quelle commande lance le serveur de développement avec rechargement automatique ?

    • fastapi dev main.py
    • python main.py --reload
    • fastapi run main.py
  3. 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

  1. Paramètres de chemin et de requête18 min
  2. Corps de requête et modèles Pydantic20 min
  3. CRUD complet, erreurs HTTP et routeurs20 min
  4. Dépendances, base de données et tests20 min

API avec FastAPI · Intermédiaire · 3 h 33