Introduction : pourquoi FastAPI change la donne
Tu connais dĂ©jĂ Flask ou Django, et tu veux aller plus vite sans sacrifier la qualitĂ© ? FastAPI est devenu le standard pour construire des APIs modernes en Python. CombinĂ© Ă Pydantic, il Ă©limine le boilerplate de validation et donne des erreurs claires dĂšs le dĂ©veloppement â pas au dĂ©ploiement.
Dans cet article, tu vas voir comment structurer un projet Python professionnel avec FastAPI, gérer la validation des données avec Pydantic, et produire une documentation interactive automatiquement. Pas de théorie abstraite : des exemples concrets que tu peux copier dans ton propre projet.
Le problÚme : trop de boilerplate pour trop peu de résultat
Avec Flask et Django REST Framework, valider un JSON entrant demande du code rĂ©pĂ©tĂ© : vĂ©rifier les types, les champs obligatoires, les contraintes. Si tu oublies un cas aux frontiĂšres, ton API renvoie une erreur 500 au lieu d’une rĂ©ponse 422 propre.
FastAPI rĂ©sout cela avec Pydantic : tu dĂ©finis un modĂšle, et la validation â y compris la sĂ©rialisation â est automatique. RĂ©sultat : moins de code, moins de bugs, et une documentation interactive (Swagger / ReDoc) gĂ©nĂ©rĂ©e sans effort supplĂ©mentaire.
Structure du projet : un modÚle réutilisable
Avant d’Ă©crire la premiĂšre route, structure ton dĂ©pĂŽt. Voici un modĂšle minimal et professionnel :
mon_api/
âââ app/
â âââ __init__.py
â âââ main.py
â âââ models.py
â âââ routes/
âââ tests/
â âââ test_routes.py
âââ requirements.txt
âââ pyproject.tomlUtilise pyproject.toml au lieu de setup.py : il est plus lisible, gĂšre les dĂ©pendances via Poetry ou pip, et s’intĂšgre avec les outils modernes (black, ruff, pytest). Pour un projet d’apprentissage, reste simple â mais habitude le bon format dĂšs le dĂ©but.
Le modĂšle Pydantic : validation en une ligne
DĂ©finis ton schĂ©ma d’entrĂ©e avec Pydantic. L’exemple ci-dessous valide un utilisateur avec un email correct, un Ăąge entre 18 et 120, et un rĂŽle autorisĂ© :
from pydantic import BaseModel, EmailStr, Field
from typing import Literal
class UserCreate(BaseModel):
email: EmailStr
name: str = Field(min_length=2, max_length=100)
age: int = Field(ge=18, le=120)
role: Literal["admin", "editor", "viewer"] = "viewer"Quand tu passes cet objet dans une route FastAPI, la validation est automatique. Si un utilisateur envoie un Ăąge de 15, l’API rĂ©pond avec un 422 et un message prĂ©cis â pas un crash, pas une erreur 500 opaque.
La route : simple, typée, documentée
Voici la route qui crĂ©e un utilisateur. Note la syntaxe : pas de dĂ©corateur complexe, pas de sĂ©rialisation manuelle. Le type UserCreate est utilisĂ© comme paramĂštre de la fonction, et FastAPI en dĂ©duit le schĂ©ma de la requĂȘte POST :
from fastapi import FastAPI
from .models import UserCreate
app = FastAPI()
@app.post("/users/", status_code=201)
def create_user(user: UserCreate):
# logique métier ici (base, service, etc.)
return {"id": 1, **user.dict()}Le résultat : au lancement du serveur, tu as déjà /docs et /redoc accessibles. Pas de documentation séparée à maintenir. Quand ton modÚle change, la doc change avec.
Tests : valider le comportement sans le serveur
FastAPI fournit un TestClient basĂ© sur Starlette. Tu peux tester tes routes sans lancer le serveur rĂ©el â essentiel pour un projet dupliquĂ© en CI/CD. Un exemple minimal :
from fastapi.testclient import TestClient
from .main import app
client = TestClient(app)
def test_create_user():
resp = client.post("/users/", json={"email":"a@b.fr","name":"Alex","age":30})
assert resp.status_code == 201
assert resp.json()["email"] == "a@b.fr"Ce test s’exĂ©cute en moins d’une seconde. Si tu ajoutes une nouvelle contrainte dans le modĂšle Pydantic, ce test valide que la route rĂ©pond correctement â pas seulement que la fonction ne plante pas.
Bonnes pratiques pour ne pas perdre le fil
- Sépare la logique métier : ne mets pas la base de données dans la route directement. Crée un module
services/ourepositories/. - Utilise des variables d’environnement :
python-dotenvoupydantic-settingspour la config (DB, secrets, ports). - Versionne ton API :
/v1/users/plutĂŽt que/users/tout de suite â cela Ă©vite les ruptures futures. - Ajoute des limites de taux :
slowapiou un proxy Nginx pour protéger contre les abus.
Conclusion : un outil, pas une religion
FastAPI + Pydantic ne remplacent pas ta rĂ©flexion sur l’architecture. Ils rĂ©duisent le bruit pour te concentrer sur ce qui compte : la logique mĂ©tier, la sĂ©curitĂ©, l’expĂ©rience utilisateur. Pour un dĂ©veloppeur en formation, c’est un excellent point d’entrĂ©e : tu comprends rapidement le cycle demande-rĂ©ponse, tu vois immĂ©diatement ce que fait ton code, et tu produis quelque chose de professionnel dĂšs le premier jour.
Pour aller plus loin : si tu veux structurer un projet réel, consulte la page Apprendre Python : de zéro à projet concret et passe au cours sur les APIs REST avec FastAPI. Tu y trouveras un projet guidé, des exercices progressifs, et un accompagnement direct.
Article publiĂ© sur adamcours.fr â formation dĂ©veloppement et IA.