--- /dev/null
+# JSON avec des octets en Base64 { #json-with-bytes-as-base64 }
+
+Si votre application doit recevoir et envoyer des données JSON, mais que vous devez y inclure des données binaires, vous pouvez les encoder en base64.
+
+## Base64 vs fichiers { #base64-vs-files }
+
+Envisagez d'abord d'utiliser [Fichiers de requĂȘte](../tutorial/request-files.md) pour tĂ©lĂ©verser des donnĂ©es binaires et [RĂ©ponse personnalisĂ©e - FileResponse](./custom-response.md#fileresponse--fileresponse-) pour envoyer des donnĂ©es binaires, plutĂŽt que de les encoder dans du JSON.
+
+JSON ne peut contenir que des chaßnes encodées en UTF-8, il ne peut donc pas contenir d'octets bruts.
+
+Base64 peut encoder des données binaires en chaßnes, mais pour cela il doit utiliser plus de caractÚres que les données binaires originales ; c'est donc en général moins efficace que des fichiers classiques.
+
+N'utilisez base64 que si vous devez absolument inclure des données binaires dans du JSON et que vous ne pouvez pas utiliser des fichiers pour cela.
+
+## Pydantic `bytes` { #pydantic-bytes }
+
+Vous pouvez déclarer un modÚle Pydantic avec des champs `bytes`, puis utiliser `val_json_bytes` dans la configuration du modÚle pour lui indiquer d'utiliser base64 pour valider les données JSON en entrée ; dans le cadre de cette validation, il décodera la chaßne base64 en octets.
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
+
+Si vous allez sur les `/docs`, vous verrez que le champ `data` attend des octets encodés en base64 :
+
+<div class="screenshot">
+<img src="/img/tutorial/json-base64-bytes/image01.png">
+</div>
+
+Vous pourriez envoyer une requĂȘte comme :
+
+```json
+{
+ "description": "Some data",
+ "data": "aGVsbG8="
+}
+```
+
+/// tip | Astuce
+
+`aGVsbG8=` est l'encodage base64 de `hello`.
+
+///
+
+Pydantic décodera ensuite la chaßne base64 et vous fournira les octets originaux dans le champ `data` du modÚle.
+
+Vous recevrez une réponse comme :
+
+```json
+{
+ "description": "Some data",
+ "content": "hello"
+}
+```
+
+## Pydantic `bytes` pour les données de sortie { #pydantic-bytes-for-output-data }
+
+Vous pouvez également utiliser des champs `bytes` avec `ser_json_bytes` dans la configuration du modÚle pour les données de sortie ; Pydantic sérialisera alors les octets en base64 lors de la génération de la réponse JSON.
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
+
+## Pydantic `bytes` pour les données d'entrée et de sortie { #pydantic-bytes-for-input-and-output-data }
+
+Et bien sĂ»r, vous pouvez utiliser le mĂȘme modĂšle configurĂ© pour utiliser base64 afin de gĂ©rer Ă la fois l'entrĂ©e (valider) avec `val_json_bytes` et la sortie (sĂ©rialiser) avec `ser_json_bytes` lors de la rĂ©ception et de l'envoi de donnĂ©es JSON.
+
+{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}
--- /dev/null
+# Diffuser des données { #stream-data }
+
+Si vous voulez diffuser des donnĂ©es pouvant ĂȘtre structurĂ©es en JSON, vous devez [Diffuser des JSON Lines](../tutorial/stream-json-lines.md).
+
+Mais si vous voulez diffuser des données binaires pures ou des chaßnes, voici comment procéder.
+
+/// info
+
+Ajouté dans FastAPI 0.134.0.
+
+///
+
+## Cas d'utilisation { #use-cases }
+
+Vous pouvez l'utiliser si vous souhaitez diffuser des chaĂźnes pures, par exemple directement depuis la sortie d'un service d'**IA LLM**.
+
+Vous pouvez également l'utiliser pour diffuser de gros fichiers binaires, en envoyant chaque bloc de données au fur et à mesure de la lecture, sans tout charger en mémoire d'un coup.
+
+Vous pouvez aussi diffuser de la **vidĂ©o** ou de l'**audio** de cette maniĂšre ; cela peut mĂȘme ĂȘtre gĂ©nĂ©rĂ© au fil du traitement et de l'envoi.
+
+## Utiliser une `StreamingResponse` avec `yield` { #a-streamingresponse-with-yield }
+
+Si vous déclarez un `response_class=StreamingResponse` dans votre *fonction de chemin d'accÚs*, vous pouvez utiliser `yield` pour envoyer chaque bloc de données à son tour.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
+
+FastAPI transmettra chaque bloc de données à la `StreamingResponse` tel quel ; il n'essaiera pas de le convertir en JSON ni autre chose similaire.
+
+### Fonctions de chemin d'accĂšs non async { #non-async-path-operation-functions }
+
+Vous pouvez Ă©galement utiliser des fonctions `def` classiques (sans `async`), et utiliser `yield` de la mĂȘme maniĂšre.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *}
+
+### Sans annotation { #no-annotation }
+
+Vous n'avez pas vraiment besoin de déclarer l'annotation de type de retour pour diffuser des données binaires.
+
+Comme FastAPI n'essaiera pas de convertir les données en JSON avec Pydantic ni de les sérialiser, dans ce cas l'annotation de type ne sert qu'à votre éditeur et à vos outils ; elle ne sera pas utilisée par FastAPI.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
+
+Cela signifie aussi qu'avec `StreamingResponse` vous avez la libertĂ© â et la responsabilitĂ© â de produire et d'encoder les octets de donnĂ©es exactement comme vous avez besoin de les envoyer, indĂ©pendamment des annotations de type. đ€
+
+### Diffuser des bytes { #stream-bytes }
+
+L'un des principaux cas d'usage consiste à diffuser des `bytes` au lieu de chaßnes ; vous pouvez bien sûr le faire.
+
+{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *}
+
+## Créer une `PNGStreamingResponse` personnalisée { #a-custom-pngstreamingresponse }
+
+Dans les exemples ci-dessus, les octets de donnĂ©es Ă©taient diffusĂ©s, mais la rĂ©ponse n'avait pas d'en-tĂȘte `Content-Type`, le client ne savait donc pas quel type de donnĂ©es il recevait.
+
+Vous pouvez crĂ©er une sous-classe personnalisĂ©e de `StreamingResponse` qui dĂ©finit l'en-tĂȘte `Content-Type` sur le type de donnĂ©es que vous diffusez.
+
+Par exemple, vous pouvez crĂ©er une `PNGStreamingResponse` qui dĂ©finit l'en-tĂȘte `Content-Type` Ă `image/png` en utilisant l'attribut `media_type` :
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
+
+Vous pouvez ensuite utiliser cette nouvelle classe dans `response_class=PNGStreamingResponse` dans votre *fonction de chemin d'accĂšs* :
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
+
+### Simuler un fichier { #simulate-a-file }
+
+Dans cet exemple, nous simulons un fichier avec `io.BytesIO`, qui est un objet de type fichier rĂ©sidant uniquement en mĂ©moire, mais qui permet d'utiliser la mĂȘme interface.
+
+Par exemple, nous pouvons itérer dessus pour en consommer le contenu, comme nous le ferions avec un fichier.
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *}
+
+/// note | Détails techniques
+
+Les deux autres variables, `image_base64` et `binary_image`, correspondent à une image encodée en Base64, puis convertie en bytes, afin de la passer à `io.BytesIO`.
+
+C'est uniquement pour que tout tienne dans le mĂȘme fichier pour cet exemple, et que vous puissiez le copier et l'exĂ©cuter tel quel. đ„
+
+///
+
+En utilisant un bloc `with`, nous nous assurons que l'objet de type fichier est fermé aprÚs l'exécution de la fonction génératrice (la fonction avec `yield`). Donc, aprÚs la fin de l'envoi de la réponse.
+
+Ce ne serait pas si important dans cet exemple précis, car il s'agit d'un faux fichier en mémoire (avec `io.BytesIO`), mais avec un vrai fichier, il est important de s'assurer qu'il est fermé une fois le travail terminé.
+
+### Gérer les fichiers et async { #files-and-async }
+
+Dans la plupart des cas, les objets de type fichier ne sont pas compatibles avec `async` et `await` par défaut.
+
+Par exemple, ils n'ont pas de `await file.read()`, ni de `async for chunk in file`.
+
+Et dans de nombreux cas, leur lecture serait une opération bloquante (pouvant bloquer la boucle d'événements), car ils sont lus depuis le disque ou le réseau.
+
+/// info
+
+L'exemple ci-dessus est en réalité une exception, car l'objet `io.BytesIO` est déjà en mémoire ; sa lecture ne bloquera donc rien.
+
+Mais dans de nombreux cas, la lecture d'un fichier ou d'un objet de type fichier bloquera.
+
+///
+
+Pour éviter de bloquer la boucle d'événements, vous pouvez simplement déclarer la *fonction de chemin d'accÚs* avec un `def` classique au lieu de `async def`. Ainsi, FastAPI l'exécutera dans un worker de pool de threads, afin d'éviter de bloquer la boucle principale.
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
+
+/// tip | Astuce
+
+Si vous devez appeler du code bloquant depuis une fonction async, ou une fonction async depuis une fonction bloquante, vous pouvez utiliser [Asyncer](https://asyncer.tiangolo.com), une bibliothĂšque sĆur de FastAPI.
+
+///
+
+### `yield from` { #yield-from }
+
+Lorsque vous itérez sur quelque chose, comme un objet de type fichier, et que vous faites un `yield` pour chaque élément, vous pouvez aussi utiliser `yield from` pour émettre chaque élément directement et éviter la boucle `for`.
+
+Ce n'est pas spĂ©cifique Ă FastAPI, c'est simplement Python, mais c'est une astuce utile Ă connaĂźtre. đ
+
+{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *}
--- /dev/null
+# Vérifier strictement le Content-Type { #strict-content-type-checking }
+
+Par dĂ©faut, FastAPI applique une vĂ©rification stricte de lâen-tĂȘte `Content-Type` pour les corps de requĂȘtes JSON ; cela signifie que les requĂȘtes JSON doivent inclure un en-tĂȘte `Content-Type` valide (par ex. `application/json`) pour que le corps soit analysĂ© comme JSON.
+
+## Risque CSRF { #csrf-risk }
+
+Ce comportement par dĂ©faut offre une protection contre une catĂ©gorie dâattaques de Cross-Site Request Forgery (CSRF) dans un scĂ©nario trĂšs spĂ©cifique.
+
+Ces attaques exploitent le fait que les navigateurs permettent Ă des scripts dâenvoyer des requĂȘtes sans effectuer de prĂ©-vĂ©rification CORS (preflight) lorsquâils :
+
+* nâont pas dâen-tĂȘte `Content-Type` (par ex. en utilisant `fetch()` avec un corps `Blob`)
+* et nâenvoient aucune information dâauthentification.
+
+Ce type dâattaque est surtout pertinent lorsque :
+
+* lâapplication sâexĂ©cute localement (par ex. sur `localhost`) ou sur un rĂ©seau interne
+* et lâapplication nâa aucun mĂ©canisme dâauthentification, elle part du principe que toute requĂȘte provenant du mĂȘme rĂ©seau est fiable.
+
+## Exemple dâattaque { #example-attack }
+
+Imaginez que vous mettiez au point un moyen dâexĂ©cuter un agent IA local.
+
+Il expose une API Ă lâadresse
+
+```
+http://localhost:8000/v1/agents/multivac
+```
+
+Il y a aussi un frontend Ă lâadresse
+
+```
+http://localhost:8000
+```
+
+/// tip | Astuce
+
+Notez quâils ont le mĂȘme hĂŽte.
+
+///
+
+Vous pouvez alors, via le frontend, amener lâagent IA Ă effectuer des actions en votre nom.
+
+Comme il sâexĂ©cute localement, et non sur lâInternet ouvert, vous dĂ©cidez de ne mettre en place aucun mĂ©canisme dâauthentification, en vous fiant simplement Ă lâaccĂšs au rĂ©seau local.
+
+Un de vos utilisateurs pourrait alors lâinstaller et lâexĂ©cuter localement.
+
+Il pourrait ensuite ouvrir un site malveillant, par exemple quelque chose comme
+
+```
+https://evilhackers.example.com
+```
+
+Et ce site malveillant enverrait des requĂȘtes en utilisant `fetch()` avec un corps `Blob` vers lâAPI locale Ă lâadresse
+
+```
+http://localhost:8000/v1/agents/multivac
+```
+
+MĂȘme si lâhĂŽte du site malveillant et celui de lâapplication locale sont diffĂ©rents, le navigateur ne dĂ©clenchera pas de prĂ©-vĂ©rification CORS (preflight) parce que :
+
+* Elle sâexĂ©cute sans aucune authentification, il nây a pas Ă envoyer dâinformations dâauthentification.
+* Le navigateur pense quâil nâenvoie pas de JSON (faute dâen-tĂȘte `Content-Type`).
+
+Le site malveillant pourrait alors amener lâagent IA local Ă envoyer des messages en colĂšre Ă lâancien patron de lâutilisateur ... ou pire. đ
+
+## Internet ouvert { #open-internet }
+
+Si votre application est exposĂ©e sur lâInternet ouvert, vous ne « ferez pas confiance au rĂ©seau » et ne laisserez pas nâimporte qui envoyer des requĂȘtes privilĂ©giĂ©es sans authentification.
+
+Des attaquants pourraient simplement exĂ©cuter un script pour envoyer des requĂȘtes Ă votre API, sans interaction avec le navigateur ; vous sĂ©curisez donc probablement dĂ©jĂ tout endpoint privilĂ©giĂ©.
+
+Dans ce cas, cette attaque / ce risque ne vous concerne pas.
+
+Ce risque et cette attaque sont surtout pertinents lorsque lâapplication sâexĂ©cute sur le rĂ©seau local et que câest la seule protection supposĂ©e.
+
+## Autoriser les requĂȘtes sans Content-Type { #allowing-requests-without-content-type }
+
+Si vous devez prendre en charge des clients qui nâenvoient pas dâen-tĂȘte `Content-Type`, vous pouvez dĂ©sactiver la vĂ©rification stricte en dĂ©finissant `strict_content_type=False` :
+
+{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *}
+
+Avec ce paramĂštre, les requĂȘtes sans en-tĂȘte `Content-Type` verront leur corps analysĂ© comme JSON, ce qui correspond au comportement des anciennes versions de FastAPI.
+
+/// info
+
+Ce comportement et cette configuration ont été ajoutés dans FastAPI 0.132.0.
+
+///
--- /dev/null
+# Prise en charge des éditeurs { #editor-support }
+
+Lâextension officielle [Extension FastAPI](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) amĂ©liore votre flux de dĂ©veloppement FastAPI grĂące Ă la dĂ©couverte des chemins d'accĂšs, Ă la navigation, ainsi quâau dĂ©ploiement sur FastAPI Cloud et Ă la diffusion en direct des journaux.
+
+Pour plus de dĂ©tails sur lâextension, reportez-vous au README sur le [rĂ©fĂ©rentiel GitHub](https://github.com/fastapi/fastapi-vscode).
+
+## Configurer et installer { #setup-and-installation }
+
+Lâ**Extension FastAPI** est disponible pour [VS Code](https://code.visualstudio.com/) et [Cursor](https://www.cursor.com/). Vous pouvez lâinstaller directement depuis le panneau Extensions de chaque Ă©diteur en recherchant « FastAPI » et en sĂ©lectionnant lâextension publiĂ©e par **FastAPI Labs**. Lâextension fonctionne Ă©galement dans les Ă©diteurs basĂ©s sur le navigateur tels que [vscode.dev](https://vscode.dev) et [github.dev](https://github.dev).
+
+### DĂ©couvrir lâapplication { #application-discovery }
+
+Par dĂ©faut, lâextension dĂ©tecte automatiquement les applications FastAPI dans votre espace de travail en recherchant les fichiers qui instancient `FastAPI()`. Si la dĂ©tection automatique ne convient pas Ă la structure de votre projet, vous pouvez spĂ©cifier un point dâentrĂ©e via `[tool.fastapi]` dans `pyproject.toml` ou le paramĂštre VS Code `fastapi.entryPoint`, en utilisant la notation de module (par ex. `myapp.main:app`).
+
+## Fonctionnalités { #features }
+
+- **Explorateur des chemins d'accĂšs** â Une vue arborescente latĂ©rale de tous les <dfn title="routes, endpoints">*chemins d'accĂšs*</dfn> de votre application. Cliquez pour accĂ©der Ă nâimporte quelle dĂ©finition de route ou de routeur.
+- **Recherche de routes** â Recherchez par chemin, mĂ©thode ou nom avec <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd> (sur macOS : <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>).
+- **Navigation CodeLens** â Liens cliquables au-dessus des appels du client de test (par ex. `client.get('/items')`) menant au *chemin d'accĂšs* correspondant, pour naviguer rapidement entre les tests et lâimplĂ©mentation.
+- **DĂ©ployer sur FastAPI Cloud** â DĂ©ploiement en un clic de votre application sur [FastAPI Cloud](https://fastapicloud.com/).
+- **Diffuser les journaux de lâapplication** â Diffusion en temps rĂ©el des journaux de votre application dĂ©ployĂ©e sur FastAPI Cloud, avec filtrage par niveau et recherche textuelle.
+
+Si vous souhaitez vous familiariser avec les fonctionnalitĂ©s de lâextension, vous pouvez consulter le guide pas Ă pas de lâextension en ouvrant la palette de commandes (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> ou sur macOS : <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>) et en sĂ©lectionnant « Welcome: Open walkthrough ... » puis en choisissant le guide « Get started with FastAPI ».
--- /dev/null
+# ĂvĂ©nements envoyĂ©s par le serveur (SSE) { #server-sent-events-sse }
+
+Vous pouvez diffuser des données vers le client en utilisant les **Server-Sent Events** (SSE).
+
+C'est similaire Ă [Diffuser des JSON Lines](stream-json-lines.md), mais cela utilise le format `text/event-stream`, pris en charge nativement par les navigateurs via lâAPI [`EventSource`](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
+
+/// info | Info
+
+Ajouté dans FastAPI 0.135.0.
+
+///
+
+## Que sont les Server-Sent Events ? { #what-are-server-sent-events }
+
+SSE est un standard pour diffuser des données du serveur au client via HTTP.
+
+Chaque événement est un petit bloc de texte avec des « champs » comme `data`, `event`, `id` et `retry`, séparés par des lignes vides.
+
+Cela ressemble Ă ceci :
+
+```
+data: {"name": "Portal Gun", "price": 999.99}
+
+data: {"name": "Plumbus", "price": 32.99}
+
+```
+
+Les SSE sont couramment utilisĂ©s pour le streaming de chat IA, les notifications en direct, les journaux et lâobservabilitĂ©, et dâautres cas oĂč le serveur envoie des mises Ă jour au client.
+
+/// tip | Astuce
+
+Si vous souhaitez diffuser des donnĂ©es binaires, par exemple de la vidĂ©o ou de lâaudio, consultez le guide avancĂ© : [Diffuser des donnĂ©es](../advanced/stream-data.md).
+
+///
+
+## Diffuser des SSE avec FastAPI { #stream-sse-with-fastapi }
+
+Pour diffuser des SSE avec FastAPI, utilisez `yield` dans votre *fonction de chemin d'accÚs* et définissez `response_class=EventSourceResponse`.
+
+Importez `EventSourceResponse` depuis `fastapi.sse` :
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *}
+
+Chaque Ă©lĂ©ment produit avec `yield` est encodĂ© en JSON et envoyĂ© dans le champ `data:` dâun Ă©vĂ©nement SSE.
+
+Si vous dĂ©clarez le type de retour comme `AsyncIterable[Item]`, FastAPI lâutilisera pour **valider**, **documenter** et **sĂ©rialiser** les donnĂ©es avec Pydantic.
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *}
+
+/// tip | Astuce
+
+Comme Pydantic le sérialisera du cÎté **Rust**, vous obtiendrez une **performance** bien supérieure que si vous ne déclarez pas de type de retour.
+
+///
+
+### Fonctions de chemin d'accĂšs non async { #non-async-path-operation-functions }
+
+Vous pouvez aussi utiliser des fonctions `def` normales (sans `async`), et utiliser `yield` de la mĂȘme façon.
+
+FastAPI sâassure quâelles sâexĂ©cutent correctement pour ne pas bloquer la boucle dâĂ©vĂ©nements.
+
+Dans ce cas la fonction nâest pas async, le type de retour appropriĂ© serait `Iterable[Item]` :
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *}
+
+### Sans type de retour { #no-return-type }
+
+Vous pouvez aussi omettre le type de retour. FastAPI utilisera le [`jsonable_encoder`](./encoder.md) pour convertir les données et les envoyer.
+
+{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *}
+
+## `ServerSentEvent` { #serversentevent }
+
+Si vous devez définir des champs SSE comme `event`, `id`, `retry` ou `comment`, vous pouvez produire des objets `ServerSentEvent` au lieu de données brutes.
+
+Importez `ServerSentEvent` depuis `fastapi.sse` :
+
+{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *}
+
+Le champ `data` est toujours encodé en JSON. Vous pouvez passer toute valeur sérialisable en JSON, y compris des modÚles Pydantic.
+
+## Données brutes { #raw-data }
+
+Si vous devez envoyer des données **sans** encodage JSON, utilisez `raw_data` au lieu de `data`.
+
+Câest utile pour envoyer du texte prĂ©formatĂ©, des lignes de log, ou des valeurs <dfn title="Une valeur utilisĂ©e pour indiquer une condition ou un Ă©tat particulier">« sentinelle »</dfn> spĂ©ciales comme `[DONE]`.
+
+{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *}
+
+/// note | Remarque
+
+`data` et `raw_data` sâexcluent mutuellement. Vous ne pouvez en dĂ©finir quâun seul par `ServerSentEvent`.
+
+///
+
+## Reprendre avec `Last-Event-ID` { #resuming-with-last-event-id }
+
+Quand un navigateur se reconnecte aprĂšs une coupure, il envoie le dernier `id` reçu dans lâen-tĂȘte `Last-Event-ID`.
+
+Vous pouvez le lire comme paramĂštre dâen-tĂȘte et lâutiliser pour reprendre le flux lĂ oĂč le client sâĂ©tait arrĂȘtĂ© :
+
+{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *}
+
+## SSE avec POST { #sse-with-post }
+
+SSE fonctionne avec **nâimporte quelle mĂ©thode HTTP**, pas seulement `GET`.
+
+Câest utile pour des protocoles comme [MCP](https://modelcontextprotocol.io) qui diffusent des SSE via `POST` :
+
+{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *}
+
+## Détails techniques { #technical-details }
+
+FastAPI met en Ćuvre certaines bonnes pratiques SSE prĂȘtes Ă lâemploi.
+
+- Envoyer un commentaire **« keep alive » `ping`** toutes les 15 secondes quand aucun message nâa Ă©tĂ© Ă©mis, pour Ă©viter que certains proxys ne ferment la connexion, comme suggĂ©rĂ© dans la [SpĂ©cification HTML : Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
+- DĂ©finir lâen-tĂȘte `Cache-Control: no-cache` pour **empĂȘcher la mise en cache** du flux.
+- DĂ©finir un en-tĂȘte spĂ©cial `X-Accel-Buffering: no` pour **empĂȘcher le buffering** dans certains proxys comme Nginx.
+
+Vous nâavez rien Ă faire, cela fonctionne prĂȘt Ă lâemploi. đ€
--- /dev/null
+# Diffuser des JSON Lines { #stream-json-lines }
+
+Vous pouvez avoir une séquence de données que vous souhaitez envoyer en « flux » ; vous pouvez le faire avec « JSON Lines ».
+
+/// info
+
+Ajouté dans FastAPI 0.134.0.
+
+///
+
+## Qu'est-ce qu'un flux ? { #what-is-a-stream }
+
+La « diffusion en continu » de donnĂ©es signifie que votre application commence Ă envoyer des Ă©lĂ©ments de donnĂ©es au client sans attendre que l'ensemble de la sĂ©quence soit prĂȘt.
+
+Ainsi, elle enverra le premier Ă©lĂ©ment, le client le recevra et commencera Ă le traiter, et vous pourriez ĂȘtre encore en train de produire l'Ă©lĂ©ment suivant.
+
+```mermaid
+sequenceDiagram
+ participant App
+ participant Client
+
+ App->>App: Produce Item 1
+ App->>Client: Send Item 1
+ App->>App: Produce Item 2
+ Client->>Client: Process Item 1
+ App->>Client: Send Item 2
+ App->>App: Produce Item 3
+ Client->>Client: Process Item 2
+ App->>Client: Send Item 3
+ Client->>Client: Process Item 3
+ Note over App: Keeps producing...
+ Note over Client: Keeps consuming...
+```
+
+Cela peut mĂȘme ĂȘtre un flux infini, oĂč vous continuez Ă envoyer des donnĂ©es.
+
+## JSON Lines { #json-lines }
+
+Dans ces cas, il est courant d'envoyer des « JSON Lines », qui est un format oĂč vous envoyez un objet JSON par ligne.
+
+Une réponse aurait un type de contenu `application/jsonl` (au lieu de `application/json`) et le corps ressemblerait à ceci :
+
+```json
+{"name": "Plumbus", "description": "A multi-purpose household device."}
+{"name": "Portal Gun", "description": "A portal opening device."}
+{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."}
+```
+
+C'est trĂšs similaire Ă un tableau JSON (Ă©quivalent d'une liste Python), mais au lieu d'ĂȘtre entourĂ© de `[]` et d'avoir des `,` entre les Ă©lĂ©ments, il y a un objet JSON par ligne, ils sont sĂ©parĂ©s par un caractĂšre de saut de ligne.
+
+/// info
+
+Le point important est que votre application pourra produire chaque ligne à son tour, tandis que le client consomme les lignes précédentes.
+
+///
+
+/// note | Détails techniques
+
+Comme chaque objet JSON sera séparé par un saut de ligne, ils ne peuvent pas contenir de caractÚres de saut de ligne littéraux dans leur contenu, mais ils peuvent contenir des sauts de ligne échappés (`\n`), ce qui fait partie du standard JSON.
+
+Mais normalement, vous n'avez pas Ă vous en soucier, c'est fait automatiquement, continuez la lecture. đ€
+
+///
+
+## Cas d'utilisation { #use-cases }
+
+Vous pouvez utiliser cela pour diffuser des donnĂ©es depuis un service **AI LLM**, depuis des **journaux** ou de la **tĂ©lĂ©mĂ©trie**, ou depuis d'autres types de donnĂ©es pouvant ĂȘtre structurĂ©es en Ă©lĂ©ments **JSON**.
+
+/// tip | Astuce
+
+Si vous voulez diffuser des données binaires, par exemple de la vidéo ou de l'audio, consultez le guide avancé : [Diffuser des données](../advanced/stream-data.md).
+
+///
+
+## Diffuser des JSON Lines avec FastAPI { #stream-json-lines-with-fastapi }
+
+Pour diffuser des JSON Lines avec FastAPI, au lieu d'utiliser `return` dans votre fonction de chemin d'accÚs, utilisez `yield` pour produire chaque élément à tour de rÎle.
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *}
+
+Si chaque élément JSON que vous voulez renvoyer est de type `Item` (un modÚle Pydantic) et que c'est une fonction async, vous pouvez déclarer le type de retour comme `AsyncIterable[Item]` :
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *}
+
+Si vous déclarez le type de retour, FastAPI l'utilisera pour **valider** les données, les **documenter** dans OpenAPI, les **filtrer**, et les **sérialiser** avec Pydantic.
+
+/// tip | Astuce
+
+Comme Pydantic les sérialisera cÎté **Rust**, vous obtiendrez une **performance** bien supérieure que si vous ne déclarez pas de type de retour.
+
+///
+
+### Fonctions de chemin d'accĂšs non asynchrones { #non-async-path-operation-functions }
+
+Vous pouvez aussi utiliser des fonctions `def` classiques (sans `async`), et utiliser `yield` de la mĂȘme maniĂšre.
+
+FastAPI s'assure qu'elle s'exécute correctement afin de ne pas bloquer la boucle d'événements.
+
+Comme dans ce cas la fonction n'est pas async, le bon type de retour serait `Iterable[Item]` :
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *}
+
+### Sans type de retour { #no-return-type }
+
+Vous pouvez Ă©galement omettre le type de retour. FastAPI utilisera alors [`jsonable_encoder`](./encoder.md) pour convertir les donnĂ©es en quelque chose qui peut ĂȘtre sĂ©rialisĂ© en JSON, puis les enverra en JSON Lines.
+
+{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *}
+
+## ĂvĂ©nements envoyĂ©s par le serveur (SSE) { #server-sent-events-sse }
+
+FastAPI propose Ă©galement une prise en charge native des Server-Sent Events (SSE), qui sont assez proches mais avec quelques dĂ©tails supplĂ©mentaires. Vous pouvez en apprendre davantage dans le chapitre suivant : [ĂvĂ©nements envoyĂ©s par le serveur (SSE)](server-sent-events.md). đ€