How to structure a Python back end and a React front end that last
Context & constraints
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.
Options considered
- 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é
The decision
Le back publie le schéma, le front génère ses types
RationaleUne rupture de contrat devient une erreur de compilation, pas un bug d'intégration détecté en recette.
Accepted consequenceUne étape de génération dans la CI.
Implementation
@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") What broke
Le streaming SSE derrière un load balancer mal configuré : la réponse arrivait d'un bloc et l'attente perçue doublait.
The outcome
- Un socle réutilisé d'un projet à l'autre, authentification et streaming inclus
- Base commune d'AIHM et de Formea
What I would do differently
Poser la pagination et la gestion d'erreurs dans le contrat dès le départ, plutôt que projet par projet.