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.toml

Utilise 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/ ou repositories/.
  • Utilise des variables d’environnement : python-dotenv ou pydantic-settings pour 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 : slowapi ou 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.