Experimenting with Starlette 1.0 with Claude skills
Expérimenter avec Starlette 1.0 et les compétences de Claude
Starlette 1.0 est enfin disponible ! C'est un événement majeur. Je pense que Starlette pourrait être le framework Python le plus utilisé par rapport à sa reconnaissance de marque relativement faible, car Starlette est la base de FastAPI, qui a suscité un énorme intérêt, éclipsant ainsi Starlette lui-même.
Kim Christie a commencé à travailler sur Starlette en 2018 et cela est rapidement devenu mon préféré parmi la nouvelle génération de frameworks ASGI pour Python. La seule raison pour laquelle je ne l'ai pas utilisé comme base pour mon propre projet Datasette était qu'il ne promettait pas encore de stabilité, et j'étais déterminé à fournir une API stable pour les plugins de Datasette... bien que je n'aie toujours pas eu le courage de publier ma propre version 1.0 (après 26 versions alpha et ça continue) !
Puis, en septembre 2025, Marcelo Trylesinski a annoncé que Starlette et Uvicorn seraient transférés sur leur compte GitHub, en reconnaissance de leurs nombreuses années de contributions et pour faciliter leur obtention de financements pour ces projets.
La version 1.0 présente quelques changements majeurs par rapport à la série 0.x, décrits dans les notes de version pour 1.0.0rc1 publiées en février.
Le changement le plus notable concerne la manière dont le code s'exécute au démarrage et à l'arrêt. Auparavant, cela était géré par les paramètres on_startup et on_shutdown, mais le nouveau système utilise un mécanisme de durée de vie basé sur un gestionnaire de contexte asynchrone :
@contextlib.asynccontextmanager
async def lifespan(app):
async with some_async_resource():
print("Exécution au démarrage !")
print("Exécution à l'arrêt !")
Si vous n'avez jamais essayé Starlette auparavant, cela ressemble à un mélange natif d'asyncio entre Flask et Django, ce qui n'est pas surprenant puisque le créateur Kim Christie est également responsable de Django REST Framework. Cela signifie que vous pouvez écrire la plupart des applications sous forme d'un seul fichier Python, dans le style de Flask.
Cela facilite vraiment la tâche pour les LLM (modèles de langage) de générer une application Starlette fonctionnelle à partir d'une seule invite.
Il y a juste un problème : si la version 1.0 rompt la compatibilité avec le code Starlette sur lequel les modèles ont été entraînés, comment pouvons-nous leur faire générer du code qui fonctionne avec 1.0 ?
J'ai décidé de voir si je pouvais faire fonctionner cela avec une compétence.
Construire une compétence avec Claude
Le Claude Chat régulier sur claude.ai possède des compétences, et l'une de ces compétences par défaut est la compétence de création de compétences. Cela signifie que Claude sait comment construire ses propres compétences.
J'ai donc commencé une session de chat et lui ai dit :
- Clone Starlette depuis GitHub - il vient juste de sortir sa version 1.0.
- Crée un document markdown de compétence pour cette version qui inclut des exemples de code pour chaque fonctionnalité.
Je ne lui ai même pas dit où trouver le dépôt, Starlette étant suffisamment connu pour que je m'attende à ce qu'il puisse le trouver tout seul.
Il a exécuté git clone https://github.com/encode/starlette.git, qui est en fait l'ancien nom du dépôt, mais GitHub gère automatiquement les redirections, donc cela a très bien fonctionné.
Le document de compétence résultant m'a semblé très complet... puis j'ai remarqué un nouveau bouton en haut que je n'avais pas vu auparavant, intitulé "Copier dans vos compétences". J'ai donc cliqué dessus :
Et maintenant, ma conversation régulière avec Claude a accès à cette compétence !
Une application de gestion de tâches
J'ai commencé une nouvelle conversation et j'ai demandé :
- Construis une application de gestion de tâches avec Starlette, elle doit avoir des projets, des tâches, des commentaires et des étiquettes.
Et Claude a fait exactement cela, produisant un clone simple de GitHub Issues utilisant Starlette 1.0, une base de données SQLite (via aiosqlite) et un modèle Jinja2.
Claude a même testé l'application manuellement de cette manière :
cd /home/claude/taskflow && timeout 5 python -c "
from database import init_db
asyncio.run(init_db())
print('Base de données initialisée avec succès')
pip install httpx --break-system-packages -q \
&& cd /home/claude/taskflow && \
from starlette.testclient import TestClient
from main import app
client = TestClient(app)
r = client.get('/api/stats')
print('Statistiques :', r.json())
r = client.get('/api/projects')
print('Projets :', len(r.json()), 'trouvés')
r = client.get('/api/tasks')
print('Tâches :', len(r.json()), 'trouvées')
r = client.get('/api/labels')
print('Étiquettes :', len(r.json()), 'trouvées')
r = client.get('/api/tasks/1')
print(f'Tâche 1 : \"{t[\"title\"]}\" - {len(t[\"comments\"])} commentaires, {len(t[\"labels\"])} étiquettes')
r = client.post('/api/tasks', json={'title':'Tâche de test','project_id':1,'priority':'high','label_ids':[1,2]})
print('Tâche créée :', r.status_code, r.json()['title'])
r = client.post('/api/comments', json={'task_id':1,'content':'Commentaire de test'})
print('Commentaire créé :', r.status_code)
r = client.get('/')
print('Page d\'accueil :', r.status_code, '- longueur :', len(r.text))
print('\nTous les tests ont réussi !'
Pour tout le buzz autour de Claude Code, il est facile d'oublier que Claude lui-même compte désormais comme un agent de codage, capable à la fois d'écrire et de tester le code qu'il génère.
Voici à quoi ressemblait l'application résultante. Le code est disponible dans mon dépôt de recherche.
Brief IA — Veille IA quotidienne
Toutes les innovations IA du monde entier, résumées et analysées automatiquement chaque jour.