Frameworks Python¶
L'écosystème Python propose un choix large de frameworks web, d'ORM et d'outils de traitement asynchrone. Le bon choix dépend de la taille du projet, des contraintes de performance et de la maturité souhaitee. Cette section couvre les options les plus utilisées en production en 2024-2025.
Comparatif des frameworks web¶
| Framework | Style | Async natif | ORM intégré | Points forts | Idéal pour |
|---|---|---|---|---|---|
| Django | Full-stack | Partiel | Oui | Admin, auth, batteries included | Applications métier complexes |
| FastAPI | API-first | Oui | Non | Performance, OpenAPI auto, type hints | APIs REST/GraphQL modernes |
| Flask | Micro | Non (ext.) | Non | Liberté totale, faible surface | Prototypes, APIs simples |
| Litestar | API-first | Oui | Non | Strict, performant, OpenAPI avance | APIs enterprise strictement typees |
Django¶
Django est le framework "batteries included" de Python. Il embarque un ORM, un système de templates, un panneau d'administration, la gestion des utilisateurs et des migrations de base de données.
Installation et projet minimal¶
# Installation
# pip install django
# Creer un projet
# django-admin startproject monprojet
# python manage.py startapp monapp
# monapp/models.py
from django.db import models
class Article(models.Model):
titre = models.CharField(max_length=200)
contenu = models.TextField()
publie_le = models.DateTimeField(auto_now_add=True)
actif = models.BooleanField(default=True)
class Meta:
ordering = ["-publie_le"]
def __str__(self) -> str:
return self.titre
# monapp/views.py
from django.http import JsonResponse
from django.views import View
from .models import Article
class ArticleListView(View):
def get(self, request):
articles = Article.objects.filter(actif=True).values(
"id", "titre", "publie_le"
)
return JsonResponse(list(articles), safe=False)
# monapp/urls.py
from django.urls import path
from .views import ArticleListView
urlpatterns = [
path("articles/", ArticleListView.as_view(), name="article-list"),
]
Django REST Framework
Pour des APIs REST complètes avec Django, utilisez Django REST Framework (DRF) qui ajoute serializers, viewsets et authentification par tokens. Installez avec pip install djangorestframework.
FastAPI¶
FastAPI est le choix dominant pour les APIs modernes en Python. Il généré automatiquement la documentation OpenAPI, exploite les type hints Python et offre des performances comparables a Node.js grâce à Starlette et uvicorn.
Installation et API minimale¶
# pip install fastapi uvicorn[standard]
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="Mon API", version="1.0.0")
class Item(BaseModel):
nom: str
prix: float
disponible: bool = True
# Stockage en memoire pour l'exemple
items: dict[int, Item] = {}
counter: int = 0
@app.get("/items", response_model=list[Item])
async def lister_items() -> list[Item]:
"""Retourne tous les items disponibles."""
return list(items.values())
@app.post("/items", response_model=Item, status_code=201)
async def creer_item(item: Item) -> Item:
"""Cree un nouvel item."""
global counter
counter += 1
items[counter] = item
return item
@app.get("/items/{item_id}", response_model=Item)
async def lire_item(item_id: int) -> Item:
"""Retourne un item par son identifiant."""
if item_id not in items:
raise HTTPException(status_code=404, detail="Item non trouve")
return items[item_id]
# Lancement du serveur de developpement
uvicorn main:app --reload
# Documentation disponible sur http://localhost:8000/docs
Flask¶
Flask est un micro-framework minimaliste. Il ne fournit que le strict nécessaire (routing, contexte de requête, templates Jinja2) et laisse le développeur choisir ses outils pour le reste.
Application minimale¶
# pip install flask
from flask import Flask, jsonify, request, abort
app = Flask(__name__)
# Stockage en memoire
catalogue: list[dict] = []
@app.get("/produits")
def lister_produits():
return jsonify(catalogue)
@app.post("/produits")
def ajouter_produit():
data = request.get_json()
if not data or "nom" not in data:
abort(400, description="Champ 'nom' requis")
catalogue.append({"id": len(catalogue) + 1, **data})
return jsonify(catalogue[-1]), 201
if __name__ == "__main__":
app.run(debug=True)
Flask en production
Ne jamais utiliser le serveur de développement Flask (app.run()) en production. Utilisez Gunicorn (gunicorn -w 4 main:app) ou uWSGI derriere un reverse proxy Nginx.
Litestar¶
Litestar (anciennement Starlite) est une alternative strictement typee a FastAPI, avec une architecture plus opiniatree et des fonctionnalités avancees comme le dependency injection intégré et le support OpenAPI complet.
# pip install litestar uvicorn
from litestar import Litestar, get, post
from litestar.exceptions import NotFoundException
from pydantic import BaseModel
class Produit(BaseModel):
nom: str
prix: float
stock: dict[int, Produit] = {}
@get("/produits")
async def lister() -> list[Produit]:
return list(stock.values())
@post("/produits")
async def creer(data: Produit) -> Produit:
stock[len(stock) + 1] = data
return data
app = Litestar(route_handlers=[lister, creer])
ORM et accès aux données¶
| ORM | Async | SQL pur possible | Intégration | Points forts |
|---|---|---|---|---|
| SQLAlchemy 2.x | Oui | Oui | Flask, FastAPI, tout | Le plus complet, très flexible |
| Django ORM | Partiel | Oui | Django uniquement | Simple, migrations intégrées |
| Tortoise ORM | Natif | Non | FastAPI, Litestar | API Django-like, full async |
| Peewee | Non | Non | Micro projets | Simple, léger |
SQLAlchemy 2.x — exemple de base¶
# pip install sqlalchemy aiosqlite
from sqlalchemy import select, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
engine = create_async_engine("sqlite+aiosqlite:///./base.db", echo=False)
class Base(DeclarativeBase):
pass
class Utilisateur(Base):
__tablename__ = "utilisateurs"
id: Mapped[int] = mapped_column(primary_key=True)
nom: Mapped[str] = mapped_column(String(100))
email: Mapped[str] = mapped_column(String(200), unique=True)
async def lire_utilisateurs(session: AsyncSession) -> list[Utilisateur]:
result = await session.execute(select(Utilisateur))
return list(result.scalars().all())
Traitement asynchrone — Celery et Dramatiq¶
Pour les tâches longues (envoi d'emails, traitement de fichiers, appels API tiers), Python dispose de deux solutions principales :
| Outil | Broker supporte | Monitoring | Simplicité | Points forts |
|---|---|---|---|---|
| Celery | Redis, RabbitMQ, SQS | Flower, Prometheus | Moyenne | Écosystème mature, très complet |
| Dramatiq | Redis, RabbitMQ | Periodiq | Élevée | API plus simple, erreurs claires |
# pip install celery redis
from celery import Celery
app = Celery(
"taches",
broker="redis://localhost:6379/0",
backend="redis://localhost:6379/1",
)
app.conf.task_serializer = "json"
app.conf.result_serializer = "json"
@app.task(bind=True, max_retries=3, default_retry_delay=60)
def envoyer_email(self, destinataire: str, sujet: str, corps: str) -> dict:
"""Tache d'envoi d'email avec retry automatique."""
try:
# Logique d'envoi ici (SMTP, SendGrid, etc.)
print(f"Email envoye a {destinataire}: {sujet}")
return {"statut": "envoye", "destinataire": destinataire}
except Exception as exc:
raise self.retry(exc=exc)
# Lancement du worker
celery -A taches worker --loglevel=info
# Appel de la tache depuis le code applicatif
# envoyer_email.delay("user@example.com", "Bienvenue", "Corps du message")
Choisir le bon framework¶
Projet complexe avec admin, auth, migrations ?
=> Django + DRF
API moderne, performances importantes, OpenAPI obligatoire ?
=> FastAPI
Prototype rapide, liberte totale de la stack ?
=> Flask
API strictement typee, equipe senior ?
=> Litestar
FastAPI est le standard emergent
Pour les nouveaux projets d'API en 2025, FastAPI est le choix par défaut dans la majorité des équipes. Sa combinaison de performances, de documentation automatique et d'intégration native avec Pydantic v2 en fait le framework le plus productif pour les APIs modernes.