Aller au contenu
Développement medium

FastAPI : créer une API REST en Python

8 min de lecture

logo python

FastAPI est le framework moderne pour écrire une API REST en Python. À partir de simples annotations de type, il génère automatiquement la validation des données et une documentation interactive OpenAPI. Ce guide vous fait construire une vraie API de zéro : installation, premières routes, validation Pydantic, gestion des erreurs et documentation auto. Tout est vérifié sur FastAPI 0.138 (Pydantic 2, Python 3.12).

Cette page est le volet pratique du concept : si vous cherchez d'abord ce qu'est une API REST, lisez API REST : définition et bonnes pratiques.

  • Installer FastAPI et le serveur Uvicorn
  • Écrire des routes GET et POST avec des annotations de type
  • Valider les données d'entrée automatiquement avec Pydantic
  • Renvoyer les bons codes HTTP et gérer les erreurs (404)
  • Profiter de la documentation OpenAPI générée toute seule

FastAPI est un framework web Python pour construire des API, bâti sur Starlette (asynchrone) et Pydantic (validation). Son idée maîtresse : vous typez vos fonctions et vos modèles de données, et FastAPI en déduit tout le reste.

  • Le type d'un paramètre devient une règle de validation : une donnée invalide est rejetée avec une erreur claire, sans une ligne de code en plus.
  • Les modèles Pydantic décrivent vos objets : FastAPI les sérialise en JSON et vérifie chaque champ.
  • La documentation OpenAPI (Swagger UI sur /docs) est générée automatiquement à partir de ces types.

C'est ce qui le distingue de Flask : là où Flask est minimaliste et vous laisse tout câbler, FastAPI vous donne validation et documentation gratuitement.

FastAPI a besoin d'un serveur ASGI pour tourner : Uvicorn. On installe les deux d'un coup, dans un environnement isolé.

Fenêtre de terminal
uv pip install fastapi "uvicorn[standard]"

Les versions au moment de ce guide : FastAPI 0.138, Pydantic 2.13, Uvicorn 0.49.

Créez un fichier main.py. On expose un petit inventaire de serveurs : un modèle Pydantic décrit un serveur, et quelques routes le manipulent.

main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
app = FastAPI(title="API Inventaire serveurs", version="1.0.0")
class Serveur(BaseModel):
hostname: str = Field(min_length=1, examples=["web-prod-01"])
ip: str
env: str = "prod"
# "base de données" en mémoire pour l'exemple
serveurs: dict[int, Serveur] = {
1: Serveur(hostname="web-prod-01", ip="10.0.1.10", env="prod"),
}
@app.get("/serveurs")
def lister_serveurs() -> list[Serveur]:
return list(serveurs.values())
@app.get("/serveurs/{serveur_id}")
def lire_serveur(serveur_id: int) -> Serveur:
if serveur_id not in serveurs:
raise HTTPException(status_code=404, detail="Serveur introuvable")
return serveurs[serveur_id]
@app.post("/serveurs", status_code=201)
def creer_serveur(serveur: Serveur) -> Serveur:
nouvel_id = max(serveurs) + 1
serveurs[nouvel_id] = serveur
return serveur

Trois choses à noter : le décorateur @app.get(...) associe une route à une fonction, le paramètre serveur_id: int convertit et valide l'URL, et le type de retour -> Serveur documente la réponse.

Uvicorn sert l'application. L'option --reload recharge à chaud à chaque modification, pratique en développement.

Fenêtre de terminal
uvicorn main:app --reload

Le main:app signifie « l'objet app du module main ». Testons les routes avec curl :

Fenêtre de terminal
curl http://127.0.0.1:8000/serveurs
# [{"hostname":"web-prod-01","ip":"10.0.1.10","env":"prod"}]
curl -X POST http://127.0.0.1:8000/serveurs \
-H "Content-Type: application/json" \
-d '{"hostname":"db-prod-01","ip":"10.0.1.20","env":"prod"}'
# 201 → {"hostname":"db-prod-01","ip":"10.0.1.20","env":"prod"}

Une ressource absente renvoie le bon code grâce à HTTPException :

Fenêtre de terminal
curl -i http://127.0.0.1:8000/serveurs/99
# HTTP/1.1 404 Not Found
# {"detail":"Serveur introuvable"}

C'est l'atout majeur de FastAPI. Notre champ hostname est déclaré Field(min_length=1). Envoyez un hostname vide :

Fenêtre de terminal
curl -X POST http://127.0.0.1:8000/serveurs \
-H "Content-Type: application/json" \
-d '{"hostname":"","ip":"10.0.0.1"}'

FastAPI répond 422 avec une erreur précise, sans que vous ayez écrit le moindre if :

{
"detail": [
{
"type": "string_too_short",
"loc": ["body", "hostname"],
"msg": "String should have at least 1 character",
"ctx": {"min_length": 1}
}
]
}

Le champ loc indique exactement où est l'erreur. C'est Pydantic qui travaille : vos types sont le contrat, et le contrat est appliqué tout seul.

Ouvrez http://127.0.0.1:8000/docs : FastAPI affiche une interface Swagger UI interactive où l'on peut essayer chaque route. Le schéma brut est sur /openapi.json :

Fenêtre de terminal
curl -s http://127.0.0.1:8000/openapi.json | head
# {"openapi":"3.1.0","info":{"title":"API Inventaire serveurs",...}

Vous obtenez une spécification OpenAPI 3.1 complète, dérivée de vos types, sans aucune configuration. Pour comprendre ce que vous générez là, voyez les bonnes pratiques d'une API REST.

PiègeConséquenceSolution
Oublier Uvicornuvicorn: command not foundInstaller uvicorn[standard]
Mauvais main:appError loading ASGI appFormat fichier:variable (sans .py)
Confondre Pydantic 1 et 2Erreurs de validateurs/configFastAPI récent exige Pydantic 2
Pas de type sur le corpsDonnées non validéesDéclarer un modèle Pydantic en paramètre
--reload en productionInstabilité, surcoût--reload en dev seulement ; en prod, plusieurs workers
  • FastAPI construit des API REST en Python à partir d'annotations de type.
  • La validation des entrées est automatique via Pydantic (erreurs 422 précises).
  • La documentation OpenAPI / Swagger (/docs) est générée toute seule.
  • On lance l'app avec uvicorn main:app --reload en développement.
  • FastAPI donne gratuitement ce que Flask vous fait câbler à la main.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn