Comment structurer un back Python et un front React qui tiennent dans la durée
Contexte & contraintes
Le même besoin revient sur chaque projet et sur les deux produits : authentification, contrat d'API, streaming, découpage des dossiers. Le rejouer de zéro coûte deux semaines à chaque fois.
Les options envisagées
- Contrat d'API rédigé côté front : rapide, mais le back suit toujours avec un train de retard
- Schéma généré depuis le back, types dérivés côté front : une seule source de vérité
La décision
Le back publie le schéma, le front génère ses types
MotifUne rupture de contrat devient une erreur de compilation, pas un bug d'intégration détecté en recette.
Conséquence acceptéeUne étape de génération dans la CI.
L'implémentation
@router.post("/ask", response_model=None)
async def ask(q: Question, user: User = Depends(current_user)):
ctx = await search(q.text, scope=user.scope)
if not ctx:
return no_source_response()
return StreamingResponse(generate(q, ctx), media_type="text/event-stream") Ce qui a cassé
Le streaming SSE derrière un load balancer mal configuré : la réponse arrivait d'un bloc et l'attente perçue doublait.
Le résultat
- Un socle réutilisé d'un projet à l'autre, authentification et streaming inclus
- Base commune d'AIHM et de Formea
Ce que je referais autrement
Poser la pagination et la gestion d'erreurs dans le contrat dès le départ, plutôt que projet par projet.