## Starlette 1.0.0 : Principales modifications dans la version stable
Starlette a atteint sa première version stable 1.0.0 après près de huit ans de développement. Cette sortie se concentre sur la suppression des API dépréciées, la correction de bugs dans la gestion des WebSocket, des formulaires et des fichiers statiques. Le framework reste la base de FastAPI et est utilisé dans le SDK Python MCP pour les applications IA.
Nouvelles fonctionnalités
La version 1.0.0 ajoute l'accès aux sessions et le suivi des modifications dans SessionMiddleware. Cela permet au middleware d'enregistrer les lectures et modifications des données de session sans astuces supplémentaires.
La version 1.0.0rc1 a introduit un état générique pour WebSocket. L'état de connexion est maintenant typé, simplifiant le travail avec TypedDict ou les modèles Pydantic dans les gestionnaires asynchrones.
Corrections de bugs
Cette sortie corrige plusieurs problèmes critiques :
- Gestion des échecs WebSocket dans StreamingResponse et FileResponse : les réponses ferment maintenant correctement les connexions sans fuites.
- FormParser utilise bytearray pour l'accumulation des champs, réduisant la consommation mémoire lors de l'analyse de formulaires volumineux.
- MultiPartParser.parse() déplace parser.finalize() dans un try/except, évitant les exceptions avec des données multipart incomplètes.
Corrections supplémentaires de rc1 :
- L'en-tête Content-Range pour les réponses 416 inclut l'unité bytes.
- StaticFiles gère les zéros bytes dans les chemins sans planter.
- L'analyse des Range utilise un tri fusionné pour plus de précision.
- Les multiples ranges dans les réponses utilisent Content-Type au lieu de Content-Range.
- Les frontières byterange multipart appliquent les terminaisons CRLF.
- FileResponse ne modifie pas les en-têtes lors des requêtes range.
- Les réponses CORS renvoient une origine explicite avec credentials.
- Jinja2Templates active autoescape par défaut.
Éléments dépréciés supprimés
Starlette 1.0.0 nettoie l'API en supprimant les fonctions dépréciées. Une migration est requise pour les projets sur des versions antérieures.
Voici la liste complète des suppressions :
- Les paramètres on_startup et on_shutdown de Starlette et Router. Remplacés par lifespan.
- Le décorateur on_event(). Utilisez lifespan.
- La méthode add_event_handler(). Utilisez lifespan.
- Les méthodes startup() et shutdown() de Router.
- Le décorateur @app.route(). Utilisez Route dans routes.
- Le décorateur @app.websocket_route(). Utilisez WebSocketRoute dans routes.
- Le décorateur @app.exception_handler(). Utilisez exception_handlers.
- Le décorateur @app.middleware(). Utilisez middleware.
- La fonction iscoroutinefunction_or_partial() de starlette.routing.
- Le paramètre **env_options de Jinja2Templates. Passez un jinja2.Environment prêt via env.
- La signature dépréciée TemplateResponse(name, context). Nécessite request : TemplateResponse(request, name, ...).
- Le paramètre method déprécié de FileResponse.
Changements de comportement
Jinja2Templates nécessite maintenant que jinja2 soit installé au moment de l'import, et non seulement à l'instanciation. Cela accélère le diagnostic des dépendances dans CI/CD.
Migration vers 1.0.0
- Remplacez tous les on_startup/on_shutdown par le contexte lifespan :
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: Starlette):
# startup
yield
# shutdown
app = Starlette(lifespan=lifespan, routes=[...])
- Déplacez les routes dans la liste routes :
routes = [
Route("/", endpoint=home),
WebSocketRoute("/ws", endpoint=ws_endpoint),
]
- Mettez à jour exception_handlers et middleware de la même manière.
- Pour Jinja2Templates, préparez env à l'avance :
import jinja2
env = jinja2.Environment(autoescape=True)
templates = Jinja2Templates(env=env)
Testez les requêtes range et les formulaires multipart après la mise à niveau.
Points clés
- Stabilité de l'API : Tous les éléments dépréciés supprimés, rendant le code plus propre et plus prévisible.
- WebSocket et Streaming : Gestion des échecs corrigée, prêt pour la production.
- Formulaires et Fichiers : Mémoire optimisée et analyse multipart/range.
- Remplacement par Lifespan : Crochets de cycle de vie unifiés, compatibles avec ASGI 3.0+.
- Jinja2 : Exigences de dépendances strictes et autoescape par défaut.
— Editorial Team
Aucun commentaire pour le moment.