Browse Source

🌐 Update translations for fr (update-outdated) (#15897)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <[email protected]>
pull/15909/head
SebastiĂĄn RamĂ­rez 22 hours ago
committed by GitHub
parent
commit
9d7d7febd3
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      docs/fr/docs/_llm-test.md
  2. 2
      docs/fr/docs/advanced/additional-status-codes.md
  3. 2
      docs/fr/docs/advanced/advanced-dependencies.md
  4. 4
      docs/fr/docs/advanced/dataclasses.md
  5. 6
      docs/fr/docs/advanced/events.md
  6. 16
      docs/fr/docs/advanced/generate-clients.md
  7. 8
      docs/fr/docs/advanced/json-base64-bytes.md
  8. 32
      docs/fr/docs/advanced/openapi-callbacks.md
  9. 2
      docs/fr/docs/advanced/response-change-status-code.md
  10. 1
      docs/fr/docs/advanced/response-cookies.md
  11. 6
      docs/fr/docs/advanced/response-headers.md
  12. 14
      docs/fr/docs/advanced/security/oauth2-scopes.md
  13. 2
      docs/fr/docs/advanced/settings.md
  14. 8
      docs/fr/docs/advanced/stream-data.md
  15. 1
      docs/fr/docs/advanced/wsgi.md
  16. 81
      docs/fr/docs/alternatives.md
  17. 200
      docs/fr/docs/async.md
  18. 4
      docs/fr/docs/deployment/cloud.md
  19. 1
      docs/fr/docs/deployment/concepts.md
  20. 4
      docs/fr/docs/deployment/docker.md
  21. 6
      docs/fr/docs/deployment/https.md
  22. 10
      docs/fr/docs/deployment/manually.md
  23. 2
      docs/fr/docs/editor-support.md
  24. 28
      docs/fr/docs/environment-variables.md
  25. 8
      docs/fr/docs/features.md
  26. 1
      docs/fr/docs/help-fastapi.md
  27. 4
      docs/fr/docs/how-to/configure-swagger-ui.md
  28. 2
      docs/fr/docs/how-to/custom-request-and-route.md
  29. 6
      docs/fr/docs/how-to/graphql.md
  30. 18
      docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
  31. 10
      docs/fr/docs/how-to/separate-openapi-schemas.md
  32. 6
      docs/fr/docs/index.md
  33. 1
      docs/fr/docs/project-generation.md
  34. 8
      docs/fr/docs/python-types.md
  35. 30
      docs/fr/docs/tutorial/bigger-applications.md
  36. 8
      docs/fr/docs/tutorial/body-nested-models.md
  37. 26
      docs/fr/docs/tutorial/body.md
  38. 20
      docs/fr/docs/tutorial/debugging.md
  39. 13
      docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md
  40. 2
      docs/fr/docs/tutorial/extra-data-types.md
  41. 46
      docs/fr/docs/tutorial/extra-models.md
  42. 32
      docs/fr/docs/tutorial/first-steps.md
  43. 4
      docs/fr/docs/tutorial/handling-errors.md
  44. 1
      docs/fr/docs/tutorial/index.md
  45. 2
      docs/fr/docs/tutorial/metadata.md
  46. 1
      docs/fr/docs/tutorial/path-operation-configuration.md
  47. 8
      docs/fr/docs/tutorial/query-params-str-validations.md
  48. 3
      docs/fr/docs/tutorial/query-params.md
  49. 1
      docs/fr/docs/tutorial/request-files.md
  50. 2
      docs/fr/docs/tutorial/request-forms.md
  51. 1
      docs/fr/docs/tutorial/response-status-code.md
  52. 14
      docs/fr/docs/tutorial/schema-extra-example.md
  53. 36
      docs/fr/docs/tutorial/security/first-steps.md
  54. 2
      docs/fr/docs/tutorial/security/get-current-user.md
  55. 12
      docs/fr/docs/tutorial/security/oauth2-jwt.md
  56. 18
      docs/fr/docs/tutorial/security/simple-oauth2.md
  57. 14
      docs/fr/docs/tutorial/sql-databases.md
  58. 8
      docs/fr/docs/tutorial/static-files.md
  59. 4
      docs/fr/docs/tutorial/testing.md
  60. 104
      docs/fr/docs/virtual-environments.md

2
docs/fr/docs/_llm-test.md

@ -148,7 +148,7 @@ Du texte
//// tab | Info //// tab | Info
Les onglets et les blocs « Info »/« Note »/« Warning »/etc. doivent avoir la traduction de leur titre ajoutée aprÚs une barre verticale (« | »). Les onglets et les blocs « Info »/« Note »/« Warning »/etc. doivent avoir la traduction de leur titre ajoutée aprÚs une barre verticale (`|`).
Voir les sections `### Special blocks` et `### Tab blocks` dans l’invite gĂ©nĂ©rale dans `scripts/translate.py`. Voir les sections `### Special blocks` et `### Tab blocks` dans l’invite gĂ©nĂ©rale dans `scripts/translate.py`.

2
docs/fr/docs/advanced/additional-status-codes.md

@ -1,6 +1,6 @@
# Codes HTTP supplémentaires { #additional-status-codes } # Codes HTTP supplémentaires { #additional-status-codes }
Par défaut, **FastAPI** renverra les réponses à l'aide d'une structure de données `JSONResponse`, en plaçant la réponse de votre *chemin d'accÚs* à l'intérieur de cette `JSONResponse`. Par défaut, **FastAPI** renverra les réponses en utilisant une `JSONResponse`, en plaçant le contenu que vous renvoyez depuis votre *chemin d'accÚs* à l'intérieur de cette `JSONResponse`.
Il utilisera le code HTTP par défaut ou celui que vous avez défini dans votre *chemin d'accÚs*. Il utilisera le code HTTP par défaut ou celui que vous avez défini dans votre *chemin d'accÚs*.

2
docs/fr/docs/advanced/advanced-dependencies.md

@ -36,7 +36,7 @@ Nous pouvons créer une instance de cette classe avec :
{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[18] *} {* ../../docs_src/dependencies/tutorial011_an_py310.py hl[18] *}
Et de cette façon, nous pouvons « paramĂ©trer » notre dĂ©pendance, qui contient maintenant « bar », en tant qu’attribut `checker.fixed_content`. Et de cette façon, nous pouvons « paramĂ©trer » notre dĂ©pendance, qui contient maintenant `"bar"`, en tant qu’attribut `checker.fixed_content`.
## Utiliser l'instance comme dépendance { #use-the-instance-as-a-dependency } ## Utiliser l'instance comme dépendance { #use-the-instance-as-a-dependency }

4
docs/fr/docs/advanced/dataclasses.md

@ -6,7 +6,7 @@ Mais FastAPI prend aussi en charge l'utilisation de [`dataclasses`](https://docs
{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
Cela fonctionne grĂące Ă  **Pydantic**, qui offre une [prise en charge interne des `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). C'est toujours pris en charge grĂące Ă  **Pydantic**, qui offre une [prise en charge interne des `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel).
Ainsi, mĂȘme avec le code ci‑dessus qui n'emploie pas explicitement Pydantic, FastAPI utilise Pydantic pour convertir ces dataclasses standard en la variante de dataclasses de Pydantic. Ainsi, mĂȘme avec le code ci‑dessus qui n'emploie pas explicitement Pydantic, FastAPI utilise Pydantic pour convertir ces dataclasses standard en la variante de dataclasses de Pydantic.
@ -20,7 +20,7 @@ Cela fonctionne de la mĂȘme maniĂšre qu'avec les modĂšles Pydantic. Et, en rĂ©al
/// note | Remarque /// note | Remarque
Gardez Ă  l'esprit que les dataclasses ne peuvent pas tout ce que peuvent faire les modĂšles Pydantic. Gardez Ă  l'esprit que les dataclasses ne peuvent pas faire tout ce que peuvent faire les modĂšles Pydantic.
Vous pourriez donc avoir encore besoin d'utiliser des modĂšles Pydantic. Vous pourriez donc avoir encore besoin d'utiliser des modĂšles Pydantic.

6
docs/fr/docs/advanced/events.md

@ -102,7 +102,7 @@ Ces fonctions peuvent ĂȘtre dĂ©clarĂ©es avec `async def` ou un `def` normal.
### ÉvĂ©nement `startup` { #startup-event } ### ÉvĂ©nement `startup` { #startup-event }
Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e avant le dĂ©marrage de l'application, dĂ©clarez-la avec l'Ă©vĂ©nement « startup » : Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e avant le dĂ©marrage de l'application, dĂ©clarez-la avec l'Ă©vĂ©nement `"startup"` :
{* ../../docs_src/events/tutorial001_py310.py hl[8] *} {* ../../docs_src/events/tutorial001_py310.py hl[8] *}
@ -114,11 +114,11 @@ Et votre application ne commencera pas Ă  recevoir des requĂȘtes avant que tous
### ÉvĂ©nement `shutdown` { #shutdown-event } ### ÉvĂ©nement `shutdown` { #shutdown-event }
Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e lorsque l'application s'arrĂȘte, dĂ©clarez-la avec l'Ă©vĂ©nement « shutdown » : Pour ajouter une fonction qui doit ĂȘtre exĂ©cutĂ©e lorsque l'application s'arrĂȘte, dĂ©clarez-la avec l'Ă©vĂ©nement `"shutdown"` :
{* ../../docs_src/events/tutorial002_py310.py hl[6] *} {* ../../docs_src/events/tutorial002_py310.py hl[6] *}
Ici, la fonction gestionnaire de l'événement `shutdown` écrira une ligne de texte « Application shutdown » dans un fichier `log.txt`. Ici, la fonction gestionnaire de l'événement `shutdown` écrira une ligne de texte `"Application shutdown"` dans un fichier `log.txt`.
/// note | Remarque /// note | Remarque

16
docs/fr/docs/advanced/generate-clients.md

@ -20,20 +20,6 @@ FastAPI génÚre automatiquement des spécifications **OpenAPI 3.1**, donc tout
/// ///
## Générateurs de SDK par les sponsors de FastAPI { #sdk-generators-from-fastapi-sponsors }
Cette section met en avant des solutions **soutenues par des fonds** et **par des entreprises** qui sponsorisent FastAPI. Ces produits offrent **des fonctionnalités supplémentaires** et **des intégrations** en plus de SDK de haute qualité générés.
En ✹ [**sponsorisant FastAPI**](../help-fastapi.md#sponsor-the-author) ✹, ces entreprises contribuent Ă  garantir que le framework et son **Ă©cosystĂšme** restent sains et **durables**.
Leur sponsoring dĂ©montre Ă©galement un fort engagement envers la **communautĂ©** FastAPI (vous), montrant qu’elles se soucient non seulement d’offrir un **excellent service**, mais aussi de soutenir un **framework robuste et florissant**, FastAPI. 🙇
Par exemple, vous pourriez essayer :
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
Certaines de ces solutions peuvent aussi ĂȘtre open source ou proposer des niveaux gratuits, afin que vous puissiez les essayer sans engagement financier. D’autres gĂ©nĂ©rateurs de SDK commerciaux existent et peuvent ĂȘtre trouvĂ©s en ligne. đŸ€“
## Créer un SDK TypeScript { #create-a-typescript-sdk } ## Créer un SDK TypeScript { #create-a-typescript-sdk }
Commençons par une application FastAPI simple : Commençons par une application FastAPI simple :
@ -56,7 +42,7 @@ Ces mĂȘmes informations issues des modĂšles, incluses dans OpenAPI, peuvent ĂȘtr
### Hey API { #hey-api } ### Hey API { #hey-api }
Une fois que vous avez une application FastAPI avec les modÚles, vous pouvez utiliser Hey API pour générer un client TypeScript. Le moyen le plus rapide de le faire est via npx. Une fois que nous avons une application FastAPI avec les modÚles, nous pouvons utiliser Hey API pour générer un client TypeScript. Le moyen le plus rapide de le faire est via npx.
```sh ```sh
npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client

8
docs/fr/docs/advanced/json-base64-bytes.md

@ -4,7 +4,7 @@ Si votre application doit recevoir et envoyer des données JSON, mais que vous d
## Base64 vs fichiers { #base64-vs-files } ## 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. 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) 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. JSON ne peut contenir que des chaßnes encodées en UTF-8, il ne peut donc pas contenir d'octets bruts.
@ -14,7 +14,7 @@ N'utilisez base64 que si vous devez absolument inclure des données binaires dan
## Pydantic `bytes` { #pydantic-bytes } ## 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. 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] *} {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
@ -52,12 +52,12 @@ Vous recevrez une réponse comme :
## Pydantic `bytes` pour les données de sortie { #pydantic-bytes-for-output-data } ## 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. 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] *} {* ../../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 } ## 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. 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] *} {* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}

32
docs/fr/docs/advanced/openapi-callbacks.md

@ -1,10 +1,10 @@
# Callbacks OpenAPI { #openapi-callbacks } # Callbacks OpenAPI { #openapi-callbacks }
Vous pourriez crĂ©er une API avec un *chemin d'accĂšs* qui dĂ©clenche une requĂȘte vers une *API externe* créée par quelqu'un d'autre (probablement la mĂȘme personne dĂ©veloppeuse qui utiliserait votre API). Vous pourriez crĂ©er une API avec un *chemin d'accĂšs* qui dĂ©clenche une requĂȘte vers une *API externe* créée par quelqu'un d'autre (probablement la mĂȘme personne dĂ©veloppeuse qui *utiliserait* votre API).
Le processus qui se produit lorsque votre application API appelle l’*API externe* s’appelle un « callback ». Parce que le logiciel Ă©crit par la personne dĂ©veloppeuse externe envoie une requĂȘte Ă  votre API puis votre API « rappelle », en envoyant une requĂȘte Ă  une *API externe* (probablement créée par la mĂȘme personne dĂ©veloppeuse). Le processus qui se produit lorsque votre application API appelle l’*API externe* s’appelle un « callback ». Parce que le logiciel Ă©crit par la personne dĂ©veloppeuse externe envoie une requĂȘte Ă  votre API puis votre API *rappelle*, en envoyant une requĂȘte Ă  une *API externe* (probablement créée par la mĂȘme personne dĂ©veloppeuse).
Dans ce cas, vous pourriez vouloir documenter à quoi cette API externe devrait ressembler. Quel *chemin d'accÚs* elle devrait avoir, quel corps elle devrait attendre, quelle réponse elle devrait renvoyer, etc. Dans ce cas, vous pourriez vouloir documenter à quoi cette API externe *devrait* ressembler. Quel *chemin d'accÚs* elle devrait avoir, quel corps elle devrait attendre, quelle réponse elle devrait renvoyer, etc.
## Une application avec des callbacks { #an-app-with-callbacks } ## Une application avec des callbacks { #an-app-with-callbacks }
@ -47,7 +47,7 @@ Le code réel du callback dépendra fortement de votre application API.
Et il variera probablement beaucoup d’une application à l’autre. Et il variera probablement beaucoup d’une application à l’autre.
Cela pourrait ĂȘtre seulement une ou deux lignes de code, comme : Cela pourrait ĂȘtre seulement une ou deux lignes de code, comme :
```Python ```Python
callback_url = "https://example.com/api/v1/invoices/events/" callback_url = "https://example.com/api/v1/invoices/events/"
@ -96,35 +96,35 @@ Commencez par créer un nouveau `APIRouter` qui contiendra un ou plusieurs callb
Pour crĂ©er le *chemin d'accĂšs* du callback, utilisez le mĂȘme `APIRouter` que vous avez créé ci-dessus. Pour crĂ©er le *chemin d'accĂšs* du callback, utilisez le mĂȘme `APIRouter` que vous avez créé ci-dessus.
Il devrait ressembler exactement à un *chemin d'accÚs* FastAPI normal : Il devrait ressembler exactement à un *chemin d'accÚs* FastAPI normal :
* Il devrait probablement dĂ©clarer le corps qu’il doit recevoir, par exemple `body: InvoiceEvent`. * Il devrait probablement dĂ©clarer le corps qu’il doit recevoir, par exemple `body: InvoiceEvent`.
* Et il pourrait aussi dĂ©clarer la rĂ©ponse qu’il doit renvoyer, par exemple `response_model=InvoiceEventReceived`. * Et il pourrait aussi dĂ©clarer la rĂ©ponse qu’il doit renvoyer, par exemple `response_model=InvoiceEventReceived`.
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *} {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
Il y a 2 principales différences par rapport à un *chemin d'accÚs* normal : Il y a 2 principales différences par rapport à un *chemin d'accÚs* normal :
* Il n’a pas besoin d’avoir de code rĂ©el, car votre application n’appellera jamais ce code. Il sert uniquement Ă  documenter l’*API externe*. La fonction peut donc simplement contenir `pass`. * Il n’a pas besoin d’avoir de code rĂ©el, car votre application n’appellera jamais ce code. Il sert uniquement Ă  documenter l’*API externe*. La fonction peut donc simplement contenir `pass`.
* Le *chemin* peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (voir plus bas) oĂč il peut utiliser des variables avec des paramĂštres et des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*. * Le *chemin* peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (voir plus bas) oĂč il peut utiliser des variables avec des paramĂštres et des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*.
### L’expression du chemin de callback { #the-callback-path-expression } ### L’expression du chemin de callback { #the-callback-path-expression }
Le *chemin* du callback peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) qui peut inclure des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*. Le *chemin* du callback peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) qui peut inclure des parties de la requĂȘte originale envoyĂ©e Ă  *votre API*.
Dans ce cas, c’est la `str` : Dans ce cas, c’est la `str` :
```Python ```Python
"{$callback_url}/invoices/{$request.body.id}" "{$callback_url}/invoices/{$request.body.id}"
``` ```
Ainsi, si l’utilisateur de votre API (la personne dĂ©veloppeuse externe) envoie une requĂȘte Ă  *votre API* vers : Ainsi, si l’utilisateur de votre API (la personne dĂ©veloppeuse externe) envoie une requĂȘte Ă  *votre API* vers :
``` ```
https://yourapi.com/invoices/?callback_url=https://www.external.org/events https://yourapi.com/invoices/?callback_url=https://www.external.org/events
``` ```
avec un corps JSON : avec un corps JSON :
```JSON ```JSON
{ {
@ -134,13 +134,13 @@ avec un corps JSON :
} }
``` ```
alors *votre API* traitera la facture et, Ă  un moment ultĂ©rieur, enverra une requĂȘte de callback Ă  `callback_url` (l’*API externe*) : alors *votre API* traitera la facture et, Ă  un moment ultĂ©rieur, enverra une requĂȘte de callback Ă  `callback_url` (l’*API externe*) :
``` ```
https://www.external.org/events/invoices/2expen51ve https://www.external.org/events/invoices/2expen51ve
``` ```
avec un corps JSON contenant quelque chose comme : avec un corps JSON contenant quelque chose comme :
```JSON ```JSON
{ {
@ -149,7 +149,7 @@ avec un corps JSON contenant quelque chose comme :
} }
``` ```
et elle s’attendra Ă  une rĂ©ponse de cette *API externe* avec un corps JSON comme : et elle s’attendrait Ă  une rĂ©ponse de cette *API externe* avec un corps JSON comme :
```JSON ```JSON
{ {
@ -167,7 +167,7 @@ Remarquez que l’URL de callback utilisĂ©e contient l’URL reçue en paramĂštr
À ce stade, vous avez le(s) *chemin(s) d'accĂšs de callback* nĂ©cessaire(s) (celui/ceux que la *personne dĂ©veloppeuse externe* doit implĂ©menter dans l’*API externe*) dans le routeur de callback que vous avez créé ci-dessus. À ce stade, vous avez le(s) *chemin(s) d'accĂšs de callback* nĂ©cessaire(s) (celui/ceux que la *personne dĂ©veloppeuse externe* doit implĂ©menter dans l’*API externe*) dans le routeur de callback que vous avez créé ci-dessus.
Utilisez maintenant le paramĂštre `callbacks` dans *le dĂ©corateur de chemin d'accĂšs de votre API* pour passer l’attribut `.routes` depuis ce routeur de callback : Utilisez maintenant le paramĂštre `callbacks` dans *le dĂ©corateur de chemin d'accĂšs de votre API* pour passer l’attribut `.routes` depuis ce routeur de callback :
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
@ -181,6 +181,6 @@ Remarquez que vous ne passez pas le routeur lui-mĂȘme (`invoices_callback_router
Vous pouvez maintenant démarrer votre application et aller sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Vous pouvez maintenant démarrer votre application et aller sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Vous verrez votre documentation incluant une section « Callbacks » pour votre *chemin d'accĂšs* qui montre Ă  quoi l’*API externe* devrait ressembler : Vous verrez votre documentation incluant une section « Callbacks » pour votre *chemin d'accĂšs* qui montre Ă  quoi l’*API externe* devrait ressembler :
<img src="/img/tutorial/openapi-callbacks/image01.png"> <img src="/img/tutorial/openapi-callbacks/image01.png">

2
docs/fr/docs/advanced/response-change-status-code.md

@ -16,7 +16,7 @@ Pour ces cas, vous pouvez utiliser un paramĂštre `Response`.
## Utiliser un paramĂštre `Response` { #use-a-response-parameter } ## Utiliser un paramĂštre `Response` { #use-a-response-parameter }
Vous pouvez dĂ©clarer un paramĂštre de type `Response` dans votre fonction de chemin d'accĂšs (comme vous pouvez le faire pour les cookies et les en-tĂȘtes). Vous pouvez dĂ©clarer un paramĂštre de type `Response` dans votre *fonction de chemin d'accĂšs* (comme vous pouvez le faire pour les cookies et les en-tĂȘtes).
Vous pouvez ensuite définir le `status_code` dans cet objet de réponse *temporaire*. Vous pouvez ensuite définir le `status_code` dans cet objet de réponse *temporaire*.

1
docs/fr/docs/advanced/response-cookies.md

@ -1,5 +1,6 @@
# Cookies de réponse { #response-cookies } # Cookies de réponse { #response-cookies }
## Utiliser un paramĂštre `Response` { #use-a-response-parameter } ## Utiliser un paramĂštre `Response` { #use-a-response-parameter }
Vous pouvez déclarer un paramÚtre de type `Response` dans votre *fonction de chemin d'accÚs*. Vous pouvez déclarer un paramÚtre de type `Response` dans votre *fonction de chemin d'accÚs*.

6
docs/fr/docs/advanced/response-headers.md

@ -2,9 +2,9 @@
## Utiliser un paramĂštre `Response` { #use-a-response-parameter } ## Utiliser un paramĂštre `Response` { #use-a-response-parameter }
Vous pouvez déclarer un paramÚtre de type `Response` dans votre fonction de chemin d'accÚs (comme vous pouvez le faire pour les cookies). Vous pouvez déclarer un paramÚtre de type `Response` dans votre *fonction de chemin d'accÚs* (comme vous pouvez le faire pour les cookies).
Vous pouvez ensuite dĂ©finir des en-tĂȘtes dans cet objet de rĂ©ponse temporaire. Vous pouvez ensuite dĂ©finir des en-tĂȘtes dans cet objet de rĂ©ponse *temporaire*.
{* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *} {* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *}
@ -12,7 +12,7 @@ Ensuite, vous pouvez renvoyer n'importe quel objet dont vous avez besoin, comme
Et si vous avez déclaré un `response_model`, il sera toujours utilisé pour filtrer et convertir l'objet que vous avez renvoyé. Et si vous avez déclaré un `response_model`, il sera toujours utilisé pour filtrer et convertir l'objet que vous avez renvoyé.
**FastAPI** utilisera cette rĂ©ponse temporaire pour extraire les en-tĂȘtes (ainsi que les cookies et le code de statut), et les placera dans la rĂ©ponse finale qui contient la valeur que vous avez renvoyĂ©e, filtrĂ©e par tout `response_model`. **FastAPI** utilisera cette rĂ©ponse *temporaire* pour extraire les en-tĂȘtes (ainsi que les cookies et le code de statut), et les placera dans la rĂ©ponse finale qui contient la valeur que vous avez renvoyĂ©e, filtrĂ©e par tout `response_model`.
Vous pouvez Ă©galement dĂ©clarer le paramĂštre `Response` dans des dĂ©pendances, et y dĂ©finir des en-tĂȘtes (et des cookies). Vous pouvez Ă©galement dĂ©clarer le paramĂštre `Response` dans des dĂ©pendances, et y dĂ©finir des en-tĂȘtes (et des cookies).

14
docs/fr/docs/advanced/security/oauth2-scopes.md

@ -2,11 +2,11 @@
Vous pouvez utiliser des scopes OAuth2 directement avec **FastAPI**, ils sont intégrés pour fonctionner de maniÚre transparente. Vous pouvez utiliser des scopes OAuth2 directement avec **FastAPI**, ils sont intégrés pour fonctionner de maniÚre transparente.
Cela vous permettrait d’avoir un systĂšme d’autorisations plus fin, conforme au standard OAuth2, intĂ©grĂ© Ă  votre application OpenAPI (et Ă  la documentation de l’API). Cela vous permettrait d’avoir un systĂšme d’autorisations plus fin, conforme au standard OAuth2, intĂ©grĂ© Ă  votre application OpenAPI (et aux documents de l’API).
OAuth2 avec scopes est le mĂ©canisme utilisĂ© par de nombreux grands fournisseurs d’authentification, comme Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Ils l’utilisent pour fournir des permissions spĂ©cifiques aux utilisateurs et aux applications. OAuth2 avec scopes est le mĂ©canisme utilisĂ© par de nombreux grands fournisseurs d’authentification, comme Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Ils l’utilisent pour fournir des permissions spĂ©cifiques aux utilisateurs et aux applications.
Chaque fois que vous « log in with » Facebook, Google, GitHub, Microsoft, X (Twitter), cette application utilise OAuth2 avec scopes. Chaque fois que vous utilisez « se connecter avec » Facebook, Google, GitHub, Microsoft, X (Twitter), cette application utilise OAuth2 avec scopes.
Dans cette section, vous verrez comment gĂ©rer l’authentification et l’autorisation avec le mĂȘme OAuth2 avec scopes dans votre application **FastAPI**. Dans cette section, vous verrez comment gĂ©rer l’authentification et l’autorisation avec le mĂȘme OAuth2 avec scopes dans votre application **FastAPI**.
@ -16,7 +16,7 @@ C’est une section plus ou moins avancĂ©e. Si vous dĂ©butez, vous pouvez la pas
Vous n’avez pas nĂ©cessairement besoin des scopes OAuth2, et vous pouvez gĂ©rer l’authentification et l’autorisation comme vous le souhaitez. Vous n’avez pas nĂ©cessairement besoin des scopes OAuth2, et vous pouvez gĂ©rer l’authentification et l’autorisation comme vous le souhaitez.
Mais OAuth2 avec scopes peut s’intĂ©grer Ă©lĂ©gamment Ă  votre API (avec OpenAPI) et Ă  votre documentation d’API. Mais OAuth2 avec scopes peut s’intĂ©grer Ă©lĂ©gamment Ă  votre API (avec OpenAPI) et Ă  vos documents d’API.
NĂ©anmoins, c’est toujours Ă  vous de faire appliquer ces scopes, ou toute autre exigence de sĂ©curitĂ©/autorisation, selon vos besoins, dans votre code. NĂ©anmoins, c’est toujours Ă  vous de faire appliquer ces scopes, ou toute autre exigence de sĂ©curitĂ©/autorisation, selon vos besoins, dans votre code.
@ -34,7 +34,7 @@ Le contenu de chacune de ces chaünes peut avoir n’importe quel format, mais n
Ces scopes représentent des « permissions ». Ces scopes représentent des « permissions ».
Dans OpenAPI (par ex. la documentation de l’API), vous pouvez dĂ©finir des « schĂ©mas de sĂ©curitĂ© ». Dans OpenAPI (par ex. les documents de l’API), vous pouvez dĂ©finir des « schĂ©mas de sĂ©curitĂ© ».
Lorsqu’un de ces schĂ©mas de sĂ©curitĂ© utilise OAuth2, vous pouvez aussi dĂ©clarer et utiliser des scopes. Lorsqu’un de ces schĂ©mas de sĂ©curitĂ© utilise OAuth2, vous pouvez aussi dĂ©clarer et utiliser des scopes.
@ -74,7 +74,7 @@ Le paramÚtre `scopes` reçoit un `dict` avec chaque scope en clé et la descrip
{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *} {* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
Comme nous dĂ©clarons maintenant ces scopes, ils apparaĂźtront dans la documentation de l’API lorsque vous vous authentifiez/autorisez. Comme nous dĂ©clarons maintenant ces scopes, ils apparaĂźtront dans les documents de l’API lorsque vous vous authentifiez/autorisez.
Et vous pourrez sĂ©lectionner Ă  quels scopes vous souhaitez accorder l’accĂšs : `me` et `items`. Et vous pourrez sĂ©lectionner Ă  quels scopes vous souhaitez accorder l’accĂšs : `me` et `items`.
@ -235,11 +235,11 @@ Elles seront vĂ©rifiĂ©es indĂ©pendamment pour chaque *chemin d’accĂšs*.
## Tester { #check-it } ## Tester { #check-it }
Si vous ouvrez la documentation de l’API, vous pouvez vous authentifier et spĂ©cifier quels scopes vous voulez autoriser. Si vous ouvrez les documents de l’API, vous pouvez vous authentifier et spĂ©cifier quels scopes vous voulez autoriser.
<img src="/img/tutorial/security/image11.png"> <img src="/img/tutorial/security/image11.png">
Si vous ne sĂ©lectionnez aucun scope, vous serez « authenticated », mais lorsque vous essayerez d’accĂ©der Ă  `/users/me/` ou `/users/me/items/`, vous obtiendrez une erreur indiquant que vous n’avez pas suffisamment de permissions. Vous pourrez toujours accĂ©der Ă  `/status/`. Si vous ne sĂ©lectionnez aucun scope, vous serez « authentifiĂ© », mais lorsque vous essayerez d’accĂ©der Ă  `/users/me/` ou `/users/me/items/`, vous obtiendrez une erreur indiquant que vous n’avez pas suffisamment de permissions. Vous pourrez toujours accĂ©der Ă  `/status/`.
Et si vous sélectionnez le scope `me` mais pas le scope `items`, vous pourrez accéder à `/users/me/` mais pas à `/users/me/items/`. Et si vous sélectionnez le scope `me` mais pas le scope `items`, vous pourrez accéder à `/users/me/` mais pas à `/users/me/items/`.

2
docs/fr/docs/advanced/settings.md

@ -144,7 +144,7 @@ Pour l'instant, vous pouvez supposer que `get_settings()` est une fonction norma
/// ///
Nous pouvons ensuite l'exiger depuis la fonction de chemin d'accĂšs comme dĂ©pendance et l'utiliser oĂč nous en avons besoin. Nous pouvons ensuite l'exiger depuis la *fonction de chemin d'accĂšs* comme dĂ©pendance et l'utiliser oĂč nous en avons besoin.
{* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *} {* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *}

8
docs/fr/docs/advanced/stream-data.md

@ -2,7 +2,7 @@
Si vous voulez diffuser des donnĂ©es pouvant ĂȘtre structurĂ©es en JSON, vous devez [Diffuser des JSON Lines](../tutorial/stream-json-lines.md). 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. Mais si vous voulez **diffuser des données binaires pures** ou des chaßnes, voici comment procéder.
/// note | Remarque /// note | Remarque
@ -14,7 +14,7 @@ Ajouté dans FastAPI 0.134.0.
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 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 é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. 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.
@ -26,7 +26,7 @@ Si vous déclarez un `response_class=StreamingResponse` dans votre *fonction de
FastAPI transmettra chaque bloc de données à la `StreamingResponse` tel quel ; il n'essaiera pas de le convertir en JSON ni autre chose similaire. 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 } ### *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. Vous pouvez Ă©galement utiliser des fonctions `def` classiques (sans `async`), et utiliser `yield` de la mĂȘme maniĂšre.
@ -40,7 +40,7 @@ Comme FastAPI n'essaiera pas de convertir les données en JSON avec Pydantic ni
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} {* ../../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. đŸ€“ 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 } ### Diffuser des bytes { #stream-bytes }

1
docs/fr/docs/advanced/wsgi.md

@ -1,5 +1,6 @@
# Inclure WSGI - Flask, Django, autres { #including-wsgi-flask-django-others } # Inclure WSGI - Flask, Django, autres { #including-wsgi-flask-django-others }
Vous pouvez monter des applications WSGI comme vous l'avez vu avec [Sous-applications - Montages](sub-applications.md), [DerriĂšre un proxy](behind-a-proxy.md). Vous pouvez monter des applications WSGI comme vous l'avez vu avec [Sous-applications - Montages](sub-applications.md), [DerriĂšre un proxy](behind-a-proxy.md).
Pour cela, vous pouvez utiliser `WSGIMiddleware` et l'utiliser pour envelopper votre application WSGI, par exemple Flask, Django, etc. Pour cela, vous pouvez utiliser `WSGIMiddleware` et l'utiliser pour envelopper votre application WSGI, par exemple Flask, Django, etc.

81
docs/fr/docs/alternatives.md

@ -39,19 +39,19 @@ premiÚres idées qui a inspiré « la recherche de » **FastAPI**.
/// note | Remarque /// note | Remarque
Django REST Framework a Ă©tĂ© créé par Tom Christie. Le crĂ©ateur de Starlette et Uvicorn, sur lesquels **FastAPI** est basĂ©. Django REST Framework a Ă©tĂ© créé par Tom Christie. Le mĂȘme crĂ©ateur de Starlette et Uvicorn, sur lesquels **FastAPI** est basĂ©.
/// ///
/// tip | A inspiré **FastAPI** à /// tip | A inspiré **FastAPI** à
Avoir une interface de documentation automatique de l'API. Avoir une interface utilisateur web de documentation automatique de l'API.
/// ///
### [Flask](https://flask.palletsprojects.com) { #flask } ### [Flask](https://flask.palletsprojects.com) { #flask }
Flask est un « micro‑framework », il ne comprend pas d'intĂ©grations de bases de donnĂ©es ni beaucoup de choses qui sont fournies par dĂ©faut dans Django. Flask est un « microframework », il ne comprend pas d'intĂ©grations de bases de donnĂ©es ni beaucoup de choses qui sont fournies par dĂ©faut dans Django.
Cette simplicité et cette flexibilité permettent d'utiliser des bases de données NoSQL comme principal systÚme de stockage de données. Cette simplicité et cette flexibilité permettent d'utiliser des bases de données NoSQL comme principal systÚme de stockage de données.
@ -60,22 +60,22 @@ technique par moments.
Il est aussi couramment utilisĂ© pour d'autres applications qui n'ont pas nĂ©cessairement besoin d'une base de donnĂ©es, de gestion des utilisateurs ou de l'une des nombreuses fonctionnalitĂ©s prĂ©installĂ©es dans Django. Bien que beaucoup de ces fonctionnalitĂ©s puissent ĂȘtre ajoutĂ©es avec des plug-ins. Il est aussi couramment utilisĂ© pour d'autres applications qui n'ont pas nĂ©cessairement besoin d'une base de donnĂ©es, de gestion des utilisateurs ou de l'une des nombreuses fonctionnalitĂ©s prĂ©installĂ©es dans Django. Bien que beaucoup de ces fonctionnalitĂ©s puissent ĂȘtre ajoutĂ©es avec des plug-ins.
Ce dĂ©couplage des parties, et le fait d'ĂȘtre un « micro‑framework » qui puisse ĂȘtre Ă©tendu pour couvrir exactement ce Ce dĂ©couplage des parties, et le fait d'ĂȘtre un « microframework » qui puisse ĂȘtre Ă©tendu pour couvrir exactement ce
qui est nécessaire, était une caractéristique clé que je voulais conserver. qui est nécessaire, était une caractéristique clé que je voulais conserver.
Compte tenu de la simplicité de Flask, il semblait bien adapté à la création d'API. La prochaine chose à trouver était un « Django REST Framework » pour Flask. Compte tenu de la simplicité de Flask, il semblait bien adapté à la création d'API. La prochaine chose à trouver était un « Django REST Framework » pour Flask.
/// tip | A inspiré **FastAPI** à /// tip | A inspiré **FastAPI** à
Être un micro‑framework. Il est donc facile de combiner les outils et les piĂšces nĂ©cessaires. Être un micro-framework. Il est donc facile de combiner les outils et les piĂšces nĂ©cessaires.
Proposer un systĂšme de routage simple et facile Ă  utiliser. Proposer un systĂšme de routing simple et facile Ă  utiliser.
/// ///
### [Requests](https://requests.readthedocs.io) { #requests } ### [Requests](https://requests.readthedocs.io) { #requests }
**FastAPI** n'est pas réellement une alternative à **Requests**. Leur cadre est trÚs différent. **FastAPI** n'est pas réellement une alternative à **Requests**. Leur portée est trÚs différente.
Il serait en fait plus courant d'utiliser Requests _à l'intérieur_ d'une application FastAPI. Il serait en fait plus courant d'utiliser Requests _à l'intérieur_ d'une application FastAPI.
@ -85,7 +85,7 @@ Mais quand mĂȘme, FastAPI s'est inspirĂ© de Requests.
Ils sont, plus ou moins, aux extrémités opposées, se complétant l'un l'autre. Ils sont, plus ou moins, aux extrémités opposées, se complétant l'un l'autre.
Requests a un design trĂšs simple et intuitif, il est trĂšs facile Ă  utiliser, avec des valeurs par dĂ©faut raisonnables, tout en Ă©tant trĂšs puissant et personnalisable. Requests a un design trĂšs simple et intuitif, il est trĂšs facile Ă  utiliser, avec des valeurs par dĂ©faut raisonnables. Mais en mĂȘme temps, il est trĂšs puissant et personnalisable.
C'est pourquoi, comme le dit le site officiel : C'est pourquoi, comme le dit le site officiel :
@ -97,7 +97,7 @@ La façon dont vous l'utilisez est trÚs simple. Par exemple, pour faire une req
response = requests.get("http://example.com/some/url") response = requests.get("http://example.com/some/url")
``` ```
L’opĂ©ration de chemin d'accĂšs correspondante dans **FastAPI** pourrait ressembler Ă  ceci : Le *chemin d'accĂšs* d'API correspondant dans **FastAPI** pourrait ressembler Ă  ceci :
```Python hl_lines="1" ```Python hl_lines="1"
@app.get("/some/url") @app.get("/some/url")
@ -117,7 +117,7 @@ Notez les similitudes entre `requests.get(...)` et `@app.get(...)`.
### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } ### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi }
La principale fonctionnalité que j'ai emprunté à Django REST Framework était la documentation automatique des API. La principale fonctionnalité que j'ai empruntée à Django REST Framework était la documentation automatique des API.
Puis j'ai découvert qu'il existait une norme pour documenter les API, en utilisant JSON (ou YAML, une extension de JSON) appelée Swagger. Puis j'ai découvert qu'il existait une norme pour documenter les API, en utilisant JSON (ou YAML, une extension de JSON) appelée Swagger.
@ -132,12 +132,12 @@ C'est pourquoi, lorsqu'on parle de la version 2.0, il est courant de dire « Swa
Adopter et utiliser une norme ouverte pour les spécifications des API, au lieu d'un schéma personnalisé. Adopter et utiliser une norme ouverte pour les spécifications des API, au lieu d'un schéma personnalisé.
Intégrer des outils d'interface utilisateur basés sur des normes : Et intégrer des outils d'interface utilisateur basés sur des normes :
* [Swagger UI](https://github.com/swagger-api/swagger-ui) * [Swagger UI](https://github.com/swagger-api/swagger-ui)
* [ReDoc](https://github.com/Rebilly/ReDoc) * [ReDoc](https://github.com/Rebilly/ReDoc)
Ces deux-là ont été choisis parce qu'ils sont populaires et stables, mais en faisant une recherche rapide, vous pourriez trouver des dizaines d'alternatives supplémentaires pour OpenAPI (que vous pouvez utiliser avec **FastAPI**). Ces deux-là ont été choisis parce qu'ils sont populaires et stables, mais en faisant une recherche rapide, vous pourriez trouver des dizaines d'interfaces utilisateur alternatives pour OpenAPI (que vous pouvez utiliser avec **FastAPI**).
/// ///
@ -149,14 +149,13 @@ permanents qui les rendent inadaptés.
### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } ### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
L'une des principales fonctionnalités nécessaires aux systÚmes API est la « <dfn title="aussi appelé : marshalling, conversion">sérialisation</dfn> » des données, qui consiste à prendre les données du code (Python) et à L'une des principales fonctionnalités nécessaires aux systÚmes API est la « <dfn title="aussi appelé marshalling, conversion">sérialisation</dfn> » des données, qui consiste à prendre les données du code (Python) et à
les convertir en quelque chose qui peut ĂȘtre envoyĂ© sur le rĂ©seau. Par exemple, convertir un objet contenant des les convertir en quelque chose qui peut ĂȘtre envoyĂ© sur le rĂ©seau. Par exemple, convertir un objet contenant des
données provenant d'une base de données en un objet JSON. Convertir des objets `datetime` en strings, etc. données provenant d'une base de données en un objet JSON. Convertir des objets `datetime` en strings, etc.
La validation des données est une autre fonctionnalité importante dont ont besoin les API. Elle permet de s'assurer La validation des données est une autre fonctionnalité importante dont ont besoin les API. Elle permet de s'assurer
que les données sont valides, compte tenu de certains paramÚtres. Par exemple, qu'un champ est un `int`, et non un que les données sont valides, compte tenu de certains paramÚtres. Par exemple, qu'un champ est un `int`, et non un
string. string. Ceci est particuliÚrement utile pour les données entrantes.
Ceci est particuliÚrement utile pour les données entrantes.
Sans un systÚme de validation des données, vous devriez effectuer toutes les vérifications à la main, dans le code. Sans un systÚme de validation des données, vous devriez effectuer toutes les vérifications à la main, dans le code.
@ -182,7 +181,7 @@ C'est un outil formidable et je l'ai beaucoup utilisé aussi, avant d'avoir **Fa
/// note | Remarque /// note | Remarque
Webargs a Ă©tĂ© créé par les dĂ©veloppeurs de Marshmallow. Webargs a Ă©tĂ© créé par les mĂȘmes dĂ©veloppeurs de Marshmallow.
/// ///
@ -206,13 +205,13 @@ Et il génÚre des schémas OpenAPI.
C'est ainsi que cela fonctionne dans Flask, Starlette, Responder, etc. C'est ainsi que cela fonctionne dans Flask, Starlette, Responder, etc.
Mais alors, nous avons Ă  nouveau le problĂšme d'avoir une micro-syntaxe, dans une docstring Python (un gros morceau de YAML). Mais alors, nous avons Ă  nouveau le problĂšme d'avoir une micro-syntaxe, dans une string Python (un gros morceau de YAML).
L'éditeur ne peut guÚre aider en la matiÚre. Et si nous modifions les paramÚtres ou les schémas Marshmallow et que nous oublions de modifier également cette docstring YAML, le schéma généré deviendrait obsolÚte. L'éditeur ne peut guÚre aider en la matiÚre. Et si nous modifions les paramÚtres ou les schémas Marshmallow et que nous oublions de modifier également cette docstring YAML, le schéma généré deviendrait obsolÚte.
/// note | Remarque /// note | Remarque
APISpec a Ă©tĂ© créé par les dĂ©veloppeurs de Marshmallow. APISpec a Ă©tĂ© créé par les mĂȘmes dĂ©veloppeurs de Marshmallow.
/// ///
@ -241,11 +240,11 @@ j'ai (ainsi que plusieurs équipes externes) utilisées jusqu'à présent :
* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase) * [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb) * [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
Ces mĂȘmes gĂ©nĂ©rateurs full-stack ont servi de base aux [GĂ©nĂ©rateurs de projets pour **FastAPI**](project-generation.md). Et ces mĂȘmes gĂ©nĂ©rateurs full-stack ont servi de base aux [GĂ©nĂ©rateurs de projets **FastAPI**](project-generation.md).
/// note | Remarque /// note | Remarque
Flask-apispec a Ă©tĂ© créé par les dĂ©veloppeurs de Marshmallow. Flask-apispec a Ă©tĂ© créé par les mĂȘmes dĂ©veloppeurs de Marshmallow.
/// ///
@ -284,9 +283,9 @@ C'Ă©tait l'un des premiers frameworks Python extrĂȘmement rapides basĂ©s sur `as
/// note | Détails techniques /// note | Détails techniques
Il utilisait [`uvloop`](https://github.com/MagicStack/uvloop) au lieu du systÚme par défaut de Python `asyncio`. C'est ce qui l'a rendu si rapide. Il utilisait [`uvloop`](https://github.com/MagicStack/uvloop) au lieu de la boucle par défaut de Python `asyncio`. C'est ce qui l'a rendu si rapide.
Il a clairement inspiré Uvicorn et Starlette, qui sont actuellement plus rapides que Sanic dans les benchmarks. Il a clairement inspiré Uvicorn et Starlette, qui sont actuellement plus rapides que Sanic dans les benchmarks ouverts.
/// ///
@ -304,7 +303,7 @@ Falcon est un autre framework Python haute performance, il est conçu pour ĂȘtre
Il est conçu pour avoir des fonctions qui reçoivent deux paramĂštres, une « requĂȘte » et une « rĂ©ponse ». Ensuite, vous Il est conçu pour avoir des fonctions qui reçoivent deux paramĂštres, une « requĂȘte » et une « rĂ©ponse ». Ensuite, vous
« lisez » des parties de la requĂȘte et « Ă©crivez » des parties dans la rĂ©ponse. En raison de cette conception, il n'est « lisez » des parties de la requĂȘte et « Ă©crivez » des parties dans la rĂ©ponse. En raison de cette conception, il n'est
pas possible de dĂ©clarer des paramĂštres de requĂȘte et des corps avec des indications de type Python standard comme paramĂštres de fonction. pas possible de dĂ©clarer des paramĂštres de requĂȘte et des corps avec des annotations de type Python standard comme paramĂštres de fonction.
Ainsi, la validation, la sĂ©rialisation et la documentation des donnĂ©es doivent ĂȘtre effectuĂ©es dans le code, et non pas automatiquement. Ou bien elles doivent ĂȘtre implĂ©mentĂ©es comme un framework au-dessus de Falcon, comme Hug. Cette mĂȘme distinction se retrouve dans d'autres frameworks qui s'inspirent de la conception de Falcon, qui consiste Ă  avoir un objet de requĂȘte et un objet de rĂ©ponse comme paramĂštres. Ainsi, la validation, la sĂ©rialisation et la documentation des donnĂ©es doivent ĂȘtre effectuĂ©es dans le code, et non pas automatiquement. Ou bien elles doivent ĂȘtre implĂ©mentĂ©es comme un framework au-dessus de Falcon, comme Hug. Cette mĂȘme distinction se retrouve dans d'autres frameworks qui s'inspirent de la conception de Falcon, qui consiste Ă  avoir un objet de requĂȘte et un objet de rĂ©ponse comme paramĂštres.
@ -326,7 +325,7 @@ J'ai découvert Molten lors des premiÚres étapes de développement de **FastAP
* Validation et documentation via ces types. * Validation et documentation via ces types.
* SystÚme d'injection de dépendances. * SystÚme d'injection de dépendances.
Il n'utilise pas une librairie tiers de validation, sérialisation et de documentation tel que Pydantic, il utilise son propre systÚme. Ainsi, ces définitions de types de données ne sont pas réutilisables aussi facilement. Il n'utilise pas une librairie tierce de validation, sérialisation et de documentation telle que Pydantic, il utilise son propre systÚme. Ainsi, ces définitions de types de données ne sont pas réutilisables aussi facilement.
Il nécessite une configuration un peu plus verbeuse. Et comme il est basé sur WSGI (au lieu d'ASGI), il n'est pas Il nécessite une configuration un peu plus verbeuse. Et comme il est basé sur WSGI (au lieu d'ASGI), il n'est pas
conçu pour profiter des hautes performances fournies par des outils comme Uvicorn, Starlette et Sanic. conçu pour profiter des hautes performances fournies par des outils comme Uvicorn, Starlette et Sanic.
@ -363,7 +362,7 @@ Comme il est basé sur l'ancienne norme pour les frameworks web Python synchrone
/// note | Remarque /// note | Remarque
Hug a Ă©tĂ© créé par Timothy Crosley, le crĂ©ateur de [`isort`](https://github.com/timothycrosley/isort), un excellent outil pour trier automatiquement les imports dans les fichiers Python. Hug a Ă©tĂ© créé par Timothy Crosley, le mĂȘme crĂ©ateur de [`isort`](https://github.com/timothycrosley/isort), un excellent outil pour trier automatiquement les imports dans les fichiers Python.
/// ///
@ -388,11 +387,11 @@ et les requĂȘtes que j'ai vues (avant NestJS et Molten). Je l'ai trouvĂ© plus ou
Il disposait de la validation automatique, sĂ©rialisation des donnĂ©es et d'une gĂ©nĂ©ration de schĂ©ma OpenAPI basĂ©e sur les mĂȘmes annotations de type Ă  plusieurs endroits. Il disposait de la validation automatique, sĂ©rialisation des donnĂ©es et d'une gĂ©nĂ©ration de schĂ©ma OpenAPI basĂ©e sur les mĂȘmes annotations de type Ă  plusieurs endroits.
La dĂ©finition du schĂ©ma de corps de requĂȘte n'utilisait pas les mĂȘmes annotations de type Python que Pydantic, il Ă©tait un peu plus proche de Marshmallow, donc le support de l'Ă©diteur n'Ă©tait pas aussi bon, mais APIStar Ă©tait quand mĂȘme la meilleure option disponible. Les dĂ©finitions de schĂ©ma de corps n'utilisaient pas les mĂȘmes annotations de type Python que Pydantic, c'Ă©tait un peu plus proche de Marshmallow, donc le support de l'Ă©diteur n'Ă©tait pas aussi bon, mais APIStar Ă©tait quand mĂȘme la meilleure option disponible.
Il avait les meilleures performances d'aprÚs les benchmarks de l'époque (seulement surpassé par Starlette). Il avait les meilleures performances d'aprÚs les benchmarks de l'époque (seulement surpassé par Starlette).
Au départ, il ne disposait pas d'une interface web de documentation automatique de l'API, mais je savais que je pouvais lui ajouter une interface Swagger. Au départ, il ne disposait pas d'une interface utilisateur web de documentation automatique de l'API, mais je savais que je pouvais lui ajouter Swagger UI.
Il avait un systĂšme d'injection de dĂ©pendances. Il nĂ©cessitait un prĂ©-enregistrement des composants, comme d'autres outils discutĂ©s ci-dessus. Mais c'Ă©tait quand mĂȘme une excellente fonctionnalitĂ©. Il avait un systĂšme d'injection de dĂ©pendances. Il nĂ©cessitait un prĂ©-enregistrement des composants, comme d'autres outils discutĂ©s ci-dessus. Mais c'Ă©tait quand mĂȘme une excellente fonctionnalitĂ©.
@ -422,7 +421,7 @@ L'idée de déclarer plusieurs choses (validation des données, sérialisation e
Et aprÚs avoir longtemps cherché un framework similaire et testé de nombreuses alternatives, APIStar était la meilleure option disponible. Et aprÚs avoir longtemps cherché un framework similaire et testé de nombreuses alternatives, APIStar était la meilleure option disponible.
Puis APIStar a cessé d'exister en tant que serveur et Starlette a été créé, et a constitué une meilleure base pour un tel systÚme. Ce fut l'inspiration finale pour construire **FastAPI**. Puis APIStar a cessé d'exister en tant que serveur et Starlette a été créé, et a constitué une nouvelle base meilleure pour un tel systÚme. Ce fut l'inspiration finale pour construire **FastAPI**.
Je considÚre **FastAPI** comme un « successeur spirituel » d'APIStar, tout en améliorant et en augmentant les fonctionnalités, le systÚme de typage et d'autres parties, sur la base des enseignements tirés de tous ces outils précédents. Je considÚre **FastAPI** comme un « successeur spirituel » d'APIStar, tout en améliorant et en augmentant les fonctionnalités, le systÚme de typage et d'autres parties, sur la base des enseignements tirés de tous ces outils précédents.
@ -441,7 +440,7 @@ basĂ© sur les mĂȘmes annotations de type Python, le support de l'Ă©diteur est gr
/// tip | **FastAPI** l'utilise pour /// tip | **FastAPI** l'utilise pour
Gérer toute la validation des données, leur sérialisation et la documentation automatique du modÚle (basée sur le schéma JSON). Gérer toute la validation des données, leur sérialisation et la documentation automatique du modÚle (basée sur JSON Schema).
**FastAPI** prend ensuite ces données JSON Schema et les place dans OpenAPI, en plus de toutes les autres choses qu'il fait. **FastAPI** prend ensuite ces données JSON Schema et les place dans OpenAPI, en plus de toutes les autres choses qu'il fait.
@ -455,20 +454,20 @@ Il est trĂšs simple et intuitif. Il est conçu pour ĂȘtre facilement extensible
Il offre : Il offre :
- Des performances vraiment impressionnantes. * Des performances vraiment impressionnantes.
- Le support des WebSockets. * Le support de WebSocket.
- Les tĂąches d'arriĂšre-plan. * Les tĂąches d'arriĂšre-plan in-process.
- Les Ă©vĂ©nements de dĂ©marrage et d'arrĂȘt. * Les Ă©vĂ©nements de dĂ©marrage et d'arrĂȘt.
- Un client de test basé sur HTTPX. * Un client de test basé sur HTTPX.
- CORS, GZip, fichiers statiques, streaming des réponses. * CORS, GZip, fichiers statiques, streaming des réponses.
- Le support des sessions et des cookies. * Le support des sessions et des cookies.
- Une couverture de test Ă  100 %. * Une couverture de test Ă  100 %.
- 100 % de la base de code avec des annotations de type. * 100 % de la base de code avec des annotations de type.
- Peu de dépendances strictes. * Peu de dépendances strictes.
Starlette est actuellement le framework Python le plus rapide testé. Seulement dépassé par Uvicorn, qui n'est pas un framework, mais un serveur. Starlette est actuellement le framework Python le plus rapide testé. Seulement dépassé par Uvicorn, qui n'est pas un framework, mais un serveur.
Starlette fournit toutes les fonctionnalitĂ©s de base d'un micro‑framework web. Starlette fournit toutes les fonctionnalitĂ©s de base d'un microframework web.
Mais il ne fournit pas de validation automatique des données, de sérialisation ou de documentation. Mais il ne fournit pas de validation automatique des données, de sérialisation ou de documentation.
@ -496,7 +495,7 @@ Ainsi, tout ce que vous pouvez faire avec Starlette, vous pouvez le faire direct
Uvicorn est un serveur ASGI rapide comme l'éclair, basé sur uvloop et httptools. Uvicorn est un serveur ASGI rapide comme l'éclair, basé sur uvloop et httptools.
Il ne s'agit pas d'un framework web, mais d'un serveur. Par exemple, il ne fournit pas d'outils pour le routing. C'est Il ne s'agit pas d'un framework web, mais d'un serveur. Par exemple, il ne fournit pas d'outils pour le routing par chemins. C'est
quelque chose qu'un framework comme Starlette (ou **FastAPI**) fournirait par-dessus. quelque chose qu'un framework comme Starlette (ou **FastAPI**) fournirait par-dessus.
C'est le serveur recommandé pour Starlette et **FastAPI**. C'est le serveur recommandé pour Starlette et **FastAPI**.

200
docs/fr/docs/async.md

@ -44,19 +44,19 @@ Si votre application (d'une certaine maniĂšre) n'a pas Ă  communiquer avec une a
--- ---
Si vous ne savez pas, utilisez seulement `def`. Si vous ne savez pas, utilisez un `def` normal.
--- ---
Note : vous pouvez mĂ©langer `def` et `async def` dans vos *fonctions de chemin d'accĂšs* autant que nĂ©cessaire, et dĂ©finir chacune avec l’option la plus adaptĂ©e pour vous. FastAPI fera ce qu'il faut avec elles. **Remarque** : vous pouvez mĂ©langer `def` et `async def` dans vos *fonctions de chemin d'accĂšs* autant que nĂ©cessaire, et dĂ©finir chacune avec l’option la plus adaptĂ©e pour vous. FastAPI fera ce qu'il faut avec elles.
Au final, peu importe le cas parmi ceux ci-dessus, FastAPI fonctionnera de maniĂšre asynchrone et sera extrĂȘmement rapide. Au final, peu importe le cas parmi ceux ci-dessus, FastAPI fonctionnera de maniĂšre asynchrone et sera extrĂȘmement rapide.
Mais si vous suivez bien les instructions ci-dessus, il pourra effectuer quelques optimisations et ainsi améliorer les performances. Mais si vous suivez bien les étapes ci-dessus, il pourra effectuer quelques optimisations de performance.
## Détails techniques { #technical-details } ## Détails techniques { #technical-details }
Les versions modernes de Python supportent le **code asynchrone** grùce aux **« coroutines »** avec les syntaxes **`async` et `await`**. Les versions modernes de Python supportent le **« code asynchrone »** en utilisant quelque chose appelé **« coroutines »**, avec la syntaxe **`async` et `await`**.
Analysons les différentes parties de cette phrase dans les sections suivantes : Analysons les différentes parties de cette phrase dans les sections suivantes :
@ -70,7 +70,7 @@ Faire du code asynchrone signifie que le langage 💬 est capable de dire à l'o
Donc, pendant ce temps, l'ordinateur pourra effectuer d'autres tĂąches, pendant que « slow-file » 📝 se termine. Donc, pendant ce temps, l'ordinateur pourra effectuer d'autres tĂąches, pendant que « slow-file » 📝 se termine.
Ensuite l'ordinateur / le programme đŸ€– reviendra Ă  chaque fois qu'il en a la chance que ce soit parce qu'il attend Ă  nouveau, ou car il đŸ€– a fini tout le travail qu'il avait Ă  faire. Il đŸ€– regardera donc si les tĂąches qu'il attend ont terminĂ© d'ĂȘtre effectuĂ©es. Ensuite l'ordinateur / le programme đŸ€– reviendra Ă  chaque fois qu'il en a la chance, parce qu'il attend Ă  nouveau, ou quand il đŸ€– a fini tout le travail qu'il avait Ă  faire Ă  ce moment-lĂ . Et il đŸ€– regardera si des tĂąches qu'il attendait ont dĂ©jĂ  terminĂ©, en faisant ce qu'il devait faire.
Ensuite, il đŸ€– prendra la premiĂšre tĂąche Ă  finir (disons, notre « slow-file » 📝) et continuera Ă  faire avec cette derniĂšre ce qu'il Ă©tait censĂ©. Ensuite, il đŸ€– prendra la premiĂšre tĂąche Ă  finir (disons, notre « slow-file » 📝) et continuera Ă  faire avec cette derniĂšre ce qu'il Ă©tait censĂ©.
@ -80,18 +80,18 @@ Ce « attendre quelque chose d'autre » fait généralement référence à des o
* de la donnée envoyée depuis votre programme soit reçue par le client à travers le réseau * de la donnée envoyée depuis votre programme soit reçue par le client à travers le réseau
* le contenu d'un fichier sur le disque soit lu par le systÚme et passé à votre programme * le contenu d'un fichier sur le disque soit lu par le systÚme et passé à votre programme
* le contenu que votre programme a passé au systÚme soit écrit sur le disque * le contenu que votre programme a passé au systÚme soit écrit sur le disque
* une opération effectuée à distance par une API se termine * une opération effectuée à distance par une API
* une opération en base de données se termine * une opération en base de données se termine
* une requĂȘte Ă  une base de donnĂ©es renvoie un rĂ©sultat * une requĂȘte Ă  une base de donnĂ©es renvoie un rĂ©sultat
* etc. * etc.
Le temps d'exécution étant consommé majoritairement par l'attente d'opérations <abbr title="Input and Output - Entrées et sorties">I/O</abbr>, on appelle ceci des opérations « I/O bound ». Le temps d'exécution étant consommé majoritairement par l'attente d'opérations <abbr title="Input and Output - Entrées et sorties">I/O</abbr>, on appelle ceci des opérations « I/O bound ».
Ce concept se nomme « asynchrone » car l'ordinateur / le programme n'a pas besoin d'ĂȘtre « synchronisĂ© » avec la tĂąche, attendant le moment exact oĂč cette derniĂšre se terminera en ne faisant rien, pour ĂȘtre capable de rĂ©cupĂ©rer le rĂ©sultat de la tĂąche et l'utiliser dans la suite des opĂ©rations. Ce concept se nomme « asynchrone » car l'ordinateur / le programme n'a pas besoin d'ĂȘtre « synchronisĂ© » avec la tĂąche lente, attendant le moment exact oĂč cette derniĂšre se terminera en ne faisant rien, pour ĂȘtre capable de rĂ©cupĂ©rer le rĂ©sultat de la tĂąche et l'utiliser dans la suite des opĂ©rations.
À la place, en Ă©tant « asynchrone », une fois terminĂ©e, une tĂąche peut lĂ©gĂšrement attendre (quelques microsecondes) que l'ordinateur / le programme finisse ce qu'il Ă©tait en train de faire, et revienne rĂ©cupĂ©rer le rĂ©sultat. À la place, en Ă©tant un systĂšme « asynchrone », une fois terminĂ©e, la tĂąche peut attendre un peu dans la file (quelques microsecondes) que l'ordinateur / le programme finisse ce qu'il Ă©tait en train de faire, puis revienne rĂ©cupĂ©rer les rĂ©sultats et continue Ă  travailler avec eux.
Pour parler de tĂąches « synchrones » (en opposition Ă  « asynchrones »), on utilise souvent le terme « sĂ©quentiel », car l'ordinateur / le programme va effectuer toutes les Ă©tapes d'une tĂąche sĂ©quentiellement avant de passer Ă  une autre tĂąche, mĂȘme si ces Ă©tapes impliquent de l'attente. Pour parler de tĂąches « synchrones » (en opposition Ă  « asynchrones »), on utilise souvent aussi le terme « sĂ©quentiel », car l'ordinateur / le programme va effectuer toutes les Ă©tapes d'une tĂąche sĂ©quentiellement avant de passer Ă  une autre tĂąche, mĂȘme si ces Ă©tapes impliquent de l'attente.
### Concurrence et Burgers { #concurrency-and-burgers } ### Concurrence et Burgers { #concurrency-and-burgers }
@ -99,49 +99,49 @@ L'idée de code **asynchrone** décrite ci-dessus est parfois aussi appelée **
La **concurrence** et le **parallĂ©lisme** sont tous deux liĂ©s Ă  l'idĂ©e de « diffĂ©rentes choses arrivant plus ou moins au mĂȘme moment ». La **concurrence** et le **parallĂ©lisme** sont tous deux liĂ©s Ă  l'idĂ©e de « diffĂ©rentes choses arrivant plus ou moins au mĂȘme moment ».
Mais les détails entre la **concurrence** et le **parallélisme** diffÚrent sur de nombreux points. Mais les détails entre la *concurrence* et le *parallélisme* sont assez différents.
Pour expliquer la différence, voici une histoire de burgers : Pour expliquer la différence, imaginez l'histoire suivante à propos de burgers :
### Burgers concurrents { #concurrent-burgers } ### Burgers concurrents { #concurrent-burgers }
Vous amenez votre crush 😍 dans votre fast food 🍔 favori, et faites la queue pendant que le serveur 💁 prend les commandes des personnes devant vous. Vous allez avec votre crush chercher de la nourriture dans un fast food, vous faites la queue pendant que le caissier prend les commandes des personnes devant vous. 😍
<img src="/img/async/concurrent-burgers/concurrent-burgers-01.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-01.png" class="illustration">
Puis vient votre tour, vous commandez alors 2 magnifiques burgers 🍔 pour votre crush 😍 et vous. Puis vient votre tour, vous commandez alors 2 burgers trĂšs sophistiquĂ©s pour votre crush et vous. 🍔🍔
<img src="/img/async/concurrent-burgers/concurrent-burgers-02.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-02.png" class="illustration">
Le serveur 💁 dit quelque chose Ă  son collĂšgue dans la cuisine 👹‍🍳 pour qu'il sache qu'il doit prĂ©parer vos burgers 🍔 (bien qu'il soit dĂ©jĂ  en train de prĂ©parer ceux des clients prĂ©cĂ©dents). Le caissier dit quelque chose au cuisinier dans la cuisine pour qu'il sache qu'il doit prĂ©parer vos burgers (bien qu'il soit dĂ©jĂ  en train de prĂ©parer ceux des clients prĂ©cĂ©dents).
<img src="/img/async/concurrent-burgers/concurrent-burgers-03.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-03.png" class="illustration">
Vous payez 💾. Vous payez. 💾
Le serveur 💁 vous donne le numĂ©ro assignĂ© Ă  votre commande. Le caissier vous donne le numĂ©ro de votre tour.
<img src="/img/async/concurrent-burgers/concurrent-burgers-04.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-04.png" class="illustration">
Pendant que vous attendez, vous allez choisir une table avec votre crush 😍, vous discutez avec votre crush 😍 pendant un long moment (les burgers Ă©tant « magnifiques » ils sont trĂšs longs Ă  prĂ©parer ✹🍔✹). Pendant que vous attendez, vous allez choisir une table avec votre crush, vous vous asseyez et discutez avec votre crush pendant un long moment (vos burgers Ă©tant trĂšs sophistiquĂ©s, ils prennent du temps Ă  prĂ©parer).
Pendant que vous ĂȘtes assis Ă  table, en attendant que les burgers 🍔 soient prĂȘts, vous pouvez passer ce temps Ă  admirer Ă  quel point votre crush 😍 est gĂ©niale, mignonne et intelligente ✹😍✹. Pendant que vous ĂȘtes assis Ă  table avec votre crush, en attendant les burgers, vous pouvez passer ce temps Ă  admirer Ă  quel point votre crush est gĂ©niale, mignonne et intelligente ✹😍✹.
<img src="/img/async/concurrent-burgers/concurrent-burgers-05.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-05.png" class="illustration">
Pendant que vous discutez avec votre crush 😍, de temps en temps vous jetez un coup d’Ɠil au nombre affichĂ© au-dessus du comptoir pour savoir si c'est Ă  votre tour d'ĂȘtre servis. Pendant que vous attendez et discutez avec votre crush, de temps en temps, vous jetez un coup d’Ɠil au nombre affichĂ© au-dessus du comptoir pour savoir si c'est dĂ©jĂ  votre tour.
Jusqu'au moment oĂč c'est (enfin) votre tour. Vous allez au comptoir, rĂ©cupĂ©rez vos burgers 🍔 et revenez Ă  votre table. Puis, Ă  un moment, c'est enfin votre tour. Vous allez au comptoir, rĂ©cupĂ©rez vos burgers et revenez Ă  votre table.
<img src="/img/async/concurrent-burgers/concurrent-burgers-06.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-06.png" class="illustration">
Vous et votre crush 😍 mangez les burgers 🍔 et passez un bon moment ✹. Vous et votre crush mangez les burgers et passez un bon moment. ✹
<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration"> <img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
/// note | Remarque /// note | Remarque
Illustrations proposĂ©es par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 Belles illustrations par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹
/// ///
@ -149,103 +149,103 @@ Illustrations proposées par [Ketrina Thompson](https://www.instagram.com/ketrin
Imaginez que vous ĂȘtes l'ordinateur / le programme đŸ€– dans cette histoire. Imaginez que vous ĂȘtes l'ordinateur / le programme đŸ€– dans cette histoire.
Pendant que vous faites la queue, vous ĂȘtre simplement inactif 😮, attendant votre tour, ne faisant rien de « productif ». Mais la queue est rapide car le serveur 💁 prend seulement les commandes (et ne les prĂ©pare pas), donc tout va bien. Pendant que vous faites la queue, vous ĂȘtes simplement inactif 😮, attendant votre tour, ne faisant rien de trĂšs « productif ». Mais la queue est rapide car le caissier prend seulement les commandes (et ne les prĂ©pare pas), donc tout va bien.
Ensuite, quand c'est votre tour, vous faites des actions « productives » đŸ€“, vous Ă©tudiez le menu, dĂ©cidez ce que vous voulez, demandez Ă  votre crush 😍 son choix, payez 💾, vĂ©rifiez que vous utilisez la bonne carte de crĂ©dit, vĂ©rifiez que le montant dĂ©bitĂ© sur la carte est correct, vĂ©rifiez que la commande contient les bons produits, etc. Ensuite, quand c'est votre tour, vous faites du vrai travail « productif », vous Ă©tudiez le menu, dĂ©cidez ce que vous voulez, demandez Ă  votre crush son choix, payez, vĂ©rifiez que vous donnez le bon billet ou la bonne carte, vĂ©rifiez que le montant dĂ©bitĂ© est correct, vĂ©rifiez que la commande contient les bons produits, etc.
Mais ensuite, mĂȘme si vous n'avez pas encore vos burgers 🍔, votre travail avec le serveur 💁 est « en pause » ⏞, car vous devez attendre 🕙 que vos burgers soient prĂȘts. Mais ensuite, mĂȘme si vous n'avez toujours pas vos burgers, votre travail avec le caissier est « en pause » ⏞, car vous devez attendre 🕙 que vos burgers soient prĂȘts.
AprĂšs vous ĂȘtre Ă©cartĂ© du comptoir et vous ĂȘtre assis Ă  votre table avec le numĂ©ro de votre commande, vous pouvez tourner 🔀 votre attention vers votre crush 😍, et « travailler » ⏯ đŸ€“ lĂ -dessus. Vous ĂȘtes donc Ă  nouveau en train de faire quelque chose de « productif » đŸ€“, vous flirtez avec votre crush 😍. Mais lorsque vous vous Ă©cartez du comptoir et vous asseyez Ă  table avec un numĂ©ro pour votre tour, vous pouvez tourner 🔀 votre attention vers votre crush, et « travailler » ⏯ đŸ€“ lĂ -dessus. Vous ĂȘtes donc Ă  nouveau en train de faire quelque chose de trĂšs « productif », comme flirter avec votre crush 😍.
Puis le serveur 💁 dit « J'ai fini de prĂ©parer les burgers » 🍔 en mettant votre numĂ©ro sur l'affichage du comptoir, mais vous ne courez pas immĂ©diatement au moment oĂč votre numĂ©ro s'affiche. Vous savez que personne ne volera vos burgers 🍔 car vous avez votre numĂ©ro et les autres clients ont le leur. Puis le caissier 💁 dit « J'ai fini de faire les burgers » en mettant votre numĂ©ro sur l'affichage du comptoir, mais vous ne sautez pas comme un fou immĂ©diatement quand le numĂ©ro affichĂ© change pour devenir votre numĂ©ro. Vous savez que personne ne volera vos burgers car vous avez le numĂ©ro de votre tour, et les autres ont le leur.
Vous attendez donc que votre crush 😍 finisse son histoire, souriez gentiment et dites que vous allez chercher les burgers ⏞. Vous attendez donc que votre crush finisse son histoire (termine le travail actuel ⏯ / la tĂąche en cours de traitement đŸ€“), souriez gentiment et dites que vous allez chercher les burgers ⏞.
Pour finir vous allez au comptoir 🔀, vers la tĂąche initiale qui est dĂ©sormais terminĂ©e ⏯, rĂ©cupĂ©rez les burgers 🍔, remerciez le serveur et ramenez les burgers 🍔 Ă  votre table. Ceci termine l'Ă©tape / la tĂąche d'interaction avec le comptoir âč. Ce qui ensuite, crĂ©e une nouvelle tĂąche de « manger les burgers » 🔀 ⏯, mais la prĂ©cĂ©dente, « rĂ©cupĂ©rer les burgers » est terminĂ©e âč. Puis vous allez au comptoir 🔀, vers la tĂąche initiale qui est dĂ©sormais terminĂ©e ⏯, rĂ©cupĂ©rez les burgers, remerciez et ramenez les burgers Ă  votre table. Ceci termine l'Ă©tape / la tĂąche d'interaction avec le comptoir âč. Ce qui ensuite crĂ©e une nouvelle tĂąche, « manger les burgers » 🔀 ⏯, mais la prĂ©cĂ©dente, « rĂ©cupĂ©rer les burgers », est terminĂ©e âč.
### Burgers parallĂšles { #parallel-burgers } ### Burgers parallĂšles { #parallel-burgers }
Imaginons désormais que ce ne sont pas des « burgers concurrents » mais des « burgers parallÚles ». Imaginons désormais que ce ne sont pas des « Burgers concurrents » mais des « Burgers parallÚles ».
Vous allez avec votre crush 😍 dans un fast food 🍔 parallĂ©lisĂ©. Vous allez avec votre crush chercher de la nourriture dans un fast food parallĂšle.
Vous attendez pendant que plusieurs (disons 8) serveurs qui sont aussi des cuisiniers 👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳 prennent les commandes des personnes devant vous. Vous attendez pendant que plusieurs (disons 8) caissiers qui sont en mĂȘme temps cuisiniers prennent les commandes des personnes devant vous.
Chaque personne devant vous attend 🕙 que son burger 🍔 soit prĂȘt avant de quitter le comptoir car chacun des 8 serveurs va lui-mĂȘme prĂ©parer le burger directement avant de prendre la commande suivante. Chaque personne devant vous attend que son burger soit prĂȘt avant de quitter le comptoir car chacun des 8 caissiers va prĂ©parer le burger directement avant de prendre la commande suivante.
<img src="/img/async/parallel-burgers/parallel-burgers-01.png" class="illustration"> <img src="/img/async/parallel-burgers/parallel-burgers-01.png" class="illustration">
Puis c'est enfin votre tour, vous commandez 2 magnifiques burgers 🍔 pour vous et votre crush 😍. Puis c'est enfin votre tour, vous commandez 2 burgers trĂšs sophistiquĂ©s pour vous et votre crush.
Vous payez 💾. Vous payez 💾.
<img src="/img/async/parallel-burgers/parallel-burgers-02.png" class="illustration"> <img src="/img/async/parallel-burgers/parallel-burgers-02.png" class="illustration">
Le serveur va dans la cuisine 👹‍🍳. Le caissier va dans la cuisine.
Vous attendez devant le comptoir afin que personne ne prenne vos burgers 🍔 avant vous, vu qu'il n'y a pas de numĂ©ro de commande. Vous attendez, debout devant le comptoir 🕙, afin que personne d'autre ne prenne vos burgers avant vous, vu qu'il n'y a pas de numĂ©ros pour les tours.
<img src="/img/async/parallel-burgers/parallel-burgers-03.png" class="illustration"> <img src="/img/async/parallel-burgers/parallel-burgers-03.png" class="illustration">
Vous et votre crush 😍 Ă©tant occupĂ©s Ă  vĂ©rifier que personne ne passe devant vous prendre vos burgers au moment oĂč ils arriveront 🕙, vous ne pouvez pas vous prĂ©occuper de votre crush 😞. Vous et votre crush Ă©tant occupĂ©s Ă  ne laisser personne passer devant vous et prendre vos burgers au moment oĂč ils arriveront, vous ne pouvez pas prĂȘter attention Ă  votre crush. 😞
C'est du travail « synchrone », vous ĂȘtre « synchronisĂ©s » avec le serveur/cuisinier 👹‍🍳. Vous devez attendre 🕙 et ĂȘtre prĂ©sent au moment exact oĂč le serveur/cuisinier 👹‍🍳 finira les burgers 🍔 et vous les donnera, sinon quelqu'un risque de vous les prendre. C'est du travail « synchrone », vous ĂȘtre « synchronisĂ©s » avec le caissier/cuisinier 👹‍🍳. Vous devez attendre 🕙 et ĂȘtre prĂ©sent au moment exact oĂč le caissier/cuisinier 👹‍🍳 finira les burgers et vous les donnera, sinon quelqu'un d'autre risque de vous les prendre.
<img src="/img/async/parallel-burgers/parallel-burgers-04.png" class="illustration"> <img src="/img/async/parallel-burgers/parallel-burgers-04.png" class="illustration">
Puis le serveur/cuisinier 👹‍🍳 revient enfin avec vos burgers 🍔, aprùs un long moment d'attente 🕙 devant le comptoir. Puis votre caissier/cuisinier 👹‍🍳 revient enfin avec vos burgers, aprùs un long moment d'attente 🕙 devant le comptoir.
<img src="/img/async/parallel-burgers/parallel-burgers-05.png" class="illustration"> <img src="/img/async/parallel-burgers/parallel-burgers-05.png" class="illustration">
Vous prenez vos burgers 🍔 et allez à une table avec votre crush 😍 Vous prenez vos burgers et allez à une table avec votre crush.
Vous les mangez, et vous avez terminĂ© 🍔 âč. Vous les mangez simplement, et vous avez terminĂ©. âč
<img src="/img/async/parallel-burgers/parallel-burgers-06.png" class="illustration"> <img src="/img/async/parallel-burgers/parallel-burgers-06.png" class="illustration">
Durant tout ce processus, il n'y a presque pas eu de discussions ou de flirts car la plupart de votre temps Ă  Ă©tĂ© passĂ© Ă  attendre 🕙 devant le comptoir 😞. Il n'y a pas eu beaucoup de discussions ou de flirts car la plupart du temps a Ă©tĂ© passĂ© Ă  attendre 🕙 devant le comptoir. 😞
/// note | Remarque /// note | Remarque
Illustrations proposĂ©es par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹 Belles illustrations par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎹
/// ///
--- ---
Dans ce scĂ©nario de burgers parallĂšles, vous ĂȘtes un ordinateur / programme đŸ€– avec deux processeurs (vous et votre crush 😍) attendant 🕙 Ă  deux et dĂ©diant votre attention ⏯ Ă  « attendre devant le comptoir » 🕙 pour une longue durĂ©e. Dans ce scĂ©nario de burgers parallĂšles, vous ĂȘtes un ordinateur / programme đŸ€– avec deux processeurs (vous et votre crush), tous deux attendant 🕙 et dĂ©diant leur attention ⏯ Ă  « attendre devant le comptoir » 🕙 pour une longue durĂ©e.
Le fast-food a 8 processeurs (serveurs/cuisiniers) 👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳. Alors que le fast-food de burgers concurrents en avait 2 (un serveur et un cuisinier). Le fast food a 8 processeurs (caissiers/cuisiniers). Alors que le fast food de burgers concurrents aurait pu n'en avoir que 2 (un caissier et un cuisinier).
Et pourtant l'expĂ©rience finale n'est pas meilleure 😞. Mais tout de mĂȘme, l'expĂ©rience finale n'est pas la meilleure. 😞
--- ---
C'est donc l'histoire Ă©quivalente parallĂšle pour les burgers 🍔. Ce serait donc l'histoire Ă©quivalente parallĂšle pour les burgers. 🍔
Pour un exemple plus courant dans la « vie réelle », imaginez une banque. Pour un exemple plus « vie réelle », imaginez une banque.
Jusqu'Ă  rĂ©cemment, la plupart des banques avaient plusieurs caisses (et banquiers) đŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’Œ et une unique file d'attente 🕙🕙🕙🕙🕙🕙🕙🕙. Jusqu'Ă  rĂ©cemment, la plupart des banques avaient plusieurs caissiers đŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’ŒđŸ‘šâ€đŸ’Œ et une grande file d'attente 🕙🕙🕙🕙🕙🕙🕙🕙.
Tous les banquiers faisaient l'intĂ©gralitĂ© du travail avec chaque client avant de passer au suivant đŸ‘šâ€đŸ’ŒâŻ. Tous les caissiers faisaient tout le travail avec chaque client avant de passer au suivant đŸ‘šâ€đŸ’ŒâŻ.
Et vous deviez attendre 🕙 dans la file pendant un long moment ou vous perdiez votre place. Et vous devez attendre 🕙 dans la file pendant un long moment ou vous perdez votre tour.
Vous n'auriez donc probablement pas envie d'amener votre crush 😍 avec vous Ă  la banque 🏩. Vous n'auriez donc probablement pas envie d'amener votre crush 😍 avec vous pour faire des dĂ©marches Ă  la banque 🏩.
### Conclusion sur les burgers { #burger-conclusion } ### Conclusion sur les burgers { #burger-conclusion }
Dans ce scĂ©nario des « burgers du fast-food avec votre crush », comme il y a beaucoup d'attente 🕙, il est trĂšs logique d'avoir un systĂšme concurrent ⏾🔀⏯. Dans ce scĂ©nario des « burgers de fast food avec votre crush », comme il y a beaucoup d'attente 🕙, il est beaucoup plus logique d'avoir un systĂšme concurrent ⏾🔀⏯.
Et c'est le cas pour la plupart des applications web. C'est le cas pour la plupart des applications web.
Vous aurez de nombreux, nombreux utilisateurs, mais votre serveur attendra 🕙 que leur connexion peu performante envoie des requĂȘtes. De trĂšs, trĂšs nombreux utilisateurs, mais votre serveur attend 🕙 que leur connexion pas trĂšs bonne envoie leurs requĂȘtes.
Puis vous attendrez 🕙 de nouveau que leurs rĂ©ponses reviennent. Puis attend 🕙 de nouveau que les rĂ©ponses reviennent.
Cette « attente » 🕙 se mesure en microsecondes, mais tout de mĂȘme, en cumulĂ© cela fait beaucoup d'attente. Cette « attente » 🕙 se mesure en microsecondes, mais tout de mĂȘme, en les cumulant toutes, cela fait beaucoup d'attente au final.
C'est pourquoi il est logique d'utiliser du code asynchrone ⏾🔀⏯ pour des APIs web. C'est pourquoi il est trùs logique d'utiliser du code asynchrone ⏾🔀⏯ pour des APIs web.
Ce type d'asynchronicité est ce qui a rendu NodeJS populaire (bien que NodeJS ne soit pas parallÚle) et c'est la force de Go en tant que langage de programmation. Ce type d'asynchronicité est ce qui a rendu NodeJS populaire (bien que NodeJS ne soit pas parallÚle) et c'est la force de Go en tant que langage de programmation.
@ -255,11 +255,11 @@ Et comme on peut avoir du parallĂ©lisme et de l'asynchronicitĂ© en mĂȘme temps,
### Est-ce que la concurrence est mieux que le parallélisme ? { #is-concurrency-better-than-parallelism } ### Est-ce que la concurrence est mieux que le parallélisme ? { #is-concurrency-better-than-parallelism }
Nope ! C'est ça la morale de l'histoire. Nope ! Ce n'est pas la morale de l'histoire.
La concurrence est diffĂ©rente du parallĂ©lisme. C'est mieux sur des scĂ©narios **spĂ©cifiques** qui impliquent beaucoup d'attente. À cause de ça, c'est gĂ©nĂ©ralement bien meilleur que le parallĂ©lisme pour le dĂ©veloppement d'applications web. Mais pas pour tout. La concurrence est diffĂ©rente du parallĂ©lisme. Et c'est mieux dans des scĂ©narios **spĂ©cifiques** qui impliquent beaucoup d'attente. À cause de ça, c'est gĂ©nĂ©ralement bien meilleur que le parallĂ©lisme pour le dĂ©veloppement d'applications web. Mais pas pour tout.
Donc pour équilibrer tout ça, imaginez l'histoire suivante : Donc pour équilibrer tout ça, imaginez l'histoire courte suivante :
> Vous devez nettoyer une grande et sale maison. > Vous devez nettoyer une grande et sale maison.
@ -269,42 +269,42 @@ Donc pour équilibrer tout ça, imaginez l'histoire suivante :
Il n'y a plus d'attente 🕙 nulle part, juste beaucoup de travail Ă  effectuer, dans diffĂ©rentes piĂšces de la maison. Il n'y a plus d'attente 🕙 nulle part, juste beaucoup de travail Ă  effectuer, dans diffĂ©rentes piĂšces de la maison.
Vous pourriez diviser en diffĂ©rentes sections comme avec les burgers, d'abord le salon, puis la cuisine, etc. Mais vous n'attendez 🕙 rien, vous ne faites que nettoyer et nettoyer, la sĂ©paration en sections ne changerait rien au final. Vous pourriez avoir des tours comme dans l'exemple des burgers, d'abord le salon, puis la cuisine, mais comme vous n'attendez 🕙 rien, vous ne faites que nettoyer et nettoyer, les tours ne changeraient rien.
Cela prendrait autant de temps pour finir avec ou sans sections (concurrence) et vous auriez effectuĂ© la mĂȘme quantitĂ© de travail. Cela prendrait autant de temps pour finir avec ou sans tours (concurrence) et vous auriez effectuĂ© la mĂȘme quantitĂ© de travail.
Mais dans ce cas, si pouviez amener 8 ex-serveurs/cuisiniers/devenus-nettoyeurs 👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳👹‍🍳, et que chacun d'eux (plus vous) pouvait prendre une zone de la maison pour la nettoyer, vous pourriez faire tout le travail en parallĂšle, et finir plus tĂŽt. Mais dans ce cas, si vous pouviez amener les 8 ex-caissiers/cuisiniers/dĂ©sormais-nettoyeurs, et que chacun d'eux (plus vous) pouvait prendre une zone de la maison pour la nettoyer, vous pourriez faire tout le travail en **parallĂšle**, avec l'aide supplĂ©mentaire, et finir beaucoup plus tĂŽt.
Dans ce scénario, chacun des nettoyeurs (vous y compris) serait un processeur, faisant sa partie du travail. Dans ce scénario, chacun des nettoyeurs (vous y compris) serait un processeur, faisant sa partie du travail.
Et comme la plupart du temps d'exécution est pris par du « vrai » travail (et non de l'attente), et que le travail dans un ordinateur est fait par un <abbr title="Central Processing Unit - Unité centrale de traitement">CPU</abbr>, ce sont des problÚmes dits « CPU bound ». Et comme la plupart du temps d'exécution est pris par du vrai travail (et non de l'attente), et que le travail dans un ordinateur est fait par un <abbr title="Central Processing Unit - Unité centrale de traitement">CPU</abbr>, ce sont des problÚmes dits « CPU bound ».
--- ---
Des exemples communs d'opérations « CPU bound » sont les procédés qui requiÚrent des traitements mathématiques complexes. Des exemples communs d'opérations CPU bound sont les choses qui requiÚrent des traitements mathématiques complexes.
Par exemple : Par exemple :
* Traitements d'**audio** et d'**images**. * Traitements d'**audio** ou d'**images**.
* La **vision par ordinateur** : une image est composĂ©e de millions de pixels, chaque pixel ayant 3 valeurs / couleurs, les traiter tous va nĂ©cessiter d'effectuer des traitements sur chaque pixel, et de prĂ©fĂ©rence tous en mĂȘme temps. * **Computer vision** : une image est composĂ©e de millions de pixels, chaque pixel ayant 3 valeurs / couleurs, les traiter nĂ©cessite normalement d'effectuer des calculs sur ces pixels, tous en mĂȘme temps.
* L'apprentissage automatique (ou **Machine Learning**) : cela nĂ©cessite de nombreuses multiplications de matrices et vecteurs. Imaginez une Ă©norme feuille de calcul remplie de nombres que vous multiplierez entre eux tous au mĂȘme moment. * **Machine Learning** : cela nĂ©cessite normalement de nombreuses multiplications de « matrices » et de « vecteurs ». Imaginez une Ă©norme feuille de calcul remplie de nombres et les multiplier tous ensemble au mĂȘme moment.
* L'apprentissage profond (ou **Deep Learning**) : est un sous-domaine du **Machine Learning**, donc les mĂȘmes raisons s'appliquent. Avec la diffĂ©rence qu'il n'y a pas une unique feuille de calcul de nombres Ă  multiplier, mais une Ă©norme quantitĂ© d'entre elles, et dans de nombreux cas, on utilise un processeur spĂ©cial pour construire et / ou utiliser ces modĂšles. * **Deep Learning** : c'est un sous-domaine du Machine Learning, donc les mĂȘmes raisons s'appliquent. C'est juste qu'il n'y a pas une unique feuille de calcul de nombres Ă  multiplier, mais une Ă©norme quantitĂ© d'entre elles, et dans de nombreux cas, on utilise un processeur spĂ©cial pour construire et / ou utiliser ces modĂšles.
### Concurrence + Parallélisme : Web + Machine Learning { #concurrency-parallelism-web-machine-learning } ### Concurrence + Parallélisme : Web + Machine Learning { #concurrency-parallelism-web-machine-learning }
Avec **FastAPI** vous pouvez bĂ©nĂ©ficier de la concurrence qui est trĂšs courante en dĂ©veloppement web (c'est l'attrait principal de NodeJS). Avec **FastAPI** vous pouvez bĂ©nĂ©ficier de la concurrence qui est trĂšs courante en dĂ©veloppement web (le mĂȘme attrait principal de NodeJS).
Mais vous pouvez aussi profiter du parallélisme et du multiprocessing (plusieurs processus s'exécutant en parallÚle) afin de gérer des charges **CPU bound** qui sont récurrentes dans les systÚmes de *Machine Learning*. Mais vous pouvez aussi profiter du parallélisme et du multiprocessing (plusieurs processus s'exécutant en parallÚle) afin de gérer des charges **CPU bound** comme celles des systÚmes de Machine Learning.
Ça, ajoutĂ© au fait que Python soit le langage le plus populaire pour la **Data Science**, le **Machine Learning** et surtout le **Deep Learning**, font de **FastAPI** un trĂšs bon choix pour les APIs et applications de **Data Science** / **Machine Learning**. Ça, ajoutĂ© au simple fait que Python soit le langage principal pour la **Data Science**, le Machine Learning et surtout le Deep Learning, fait de FastAPI un trĂšs bon choix pour les APIs web et applications de Data Science / Machine Learning (entre autres).
Pour comprendre comment mettre en place ce parallélisme en production, allez lire la section [Déploiement](deployment/index.md). Pour comprendre comment mettre en place ce parallélisme en production, consultez la section sur le [Déploiement](deployment/index.md).
## `async` et `await` { #async-and-await } ## `async` et `await` { #async-and-await }
Les versions modernes de Python ont une maniÚre trÚs intuitive de définir le code asynchrone, tout en gardant une apparence de code « séquentiel » classique en laissant Python faire l'attente pour vous au bon moment. Les versions modernes de Python ont une maniÚre trÚs intuitive de définir le code asynchrone. Cela le fait ressembler à du code « séquentiel » normal et effectue l'« attente » pour vous aux bons moments.
Pour une opération qui nécessite de l'attente avant de donner un résultat et qui supporte ces nouvelles fonctionnalités Python, vous pouvez l'utiliser comme tel : Pour une opération qui nécessite de l'attente avant de donner un résultat et qui supporte ces nouvelles fonctionnalités Python, vous pouvez l'écrire comme ceci :
```Python ```Python
burgers = await get_burgers(2) burgers = await get_burgers(2)
@ -312,7 +312,7 @@ burgers = await get_burgers(2)
Le mot-clĂ© important ici est `await`. Il informe Python qu'il faut attendre ⏞ que `get_burgers(2)` finisse d'effectuer ses opĂ©rations 🕙 avant de stocker les rĂ©sultats dans la variable `burgers`. GrĂące Ă  cela, Python saura qu'il peut aller effectuer d'autres opĂ©rations 🔀 ⏯ pendant ce temps (comme par exemple recevoir une autre requĂȘte). Le mot-clĂ© important ici est `await`. Il informe Python qu'il faut attendre ⏞ que `get_burgers(2)` finisse d'effectuer ses opĂ©rations 🕙 avant de stocker les rĂ©sultats dans la variable `burgers`. GrĂące Ă  cela, Python saura qu'il peut aller effectuer d'autres opĂ©rations 🔀 ⏯ pendant ce temps (comme par exemple recevoir une autre requĂȘte).
Pour que `await` fonctionne, il doit ĂȘtre placĂ© dans une fonction qui supporte l'asynchronicitĂ©. Pour que ça soit le cas, il faut dĂ©clarer cette derniĂšre avec `async def` : Pour que `await` fonctionne, il doit ĂȘtre placĂ© dans une fonction qui supporte cette asynchronicitĂ©. Pour que ça soit le cas, il faut dĂ©clarer cette derniĂšre avec `async def` :
```Python hl_lines="1" ```Python hl_lines="1"
async def get_burgers(number: int): async def get_burgers(number: int):
@ -320,7 +320,7 @@ async def get_burgers(number: int):
return burgers return burgers
``` ```
... et non `def` : ... au lieu de `def` :
```Python hl_lines="2" ```Python hl_lines="2"
# Ceci n'est pas asynchrone # Ceci n'est pas asynchrone
@ -331,16 +331,16 @@ def get_sequential_burgers(number: int):
Avec `async def`, Python sait que dans cette fonction il doit prendre en compte les expressions `await`, et qu'il peut mettre en pause ⏞ l'exĂ©cution de la fonction pour aller faire autre chose 🔀 avant de revenir. Avec `async def`, Python sait que dans cette fonction il doit prendre en compte les expressions `await`, et qu'il peut mettre en pause ⏞ l'exĂ©cution de la fonction pour aller faire autre chose 🔀 avant de revenir.
Pour appeler une fonction définie avec `async def`, vous devez utiliser `await`. Donc ceci ne marche pas : Lorsque vous voulez appeler une fonction `async def`, vous devez l'« attendre ». Donc ceci ne marche pas :
```Python ```Python
# Ceci ne fonctionne pas, car get_burgers a été défini avec async def # Ceci ne fonctionne pas, car get_burgers a été défini avec : async def
burgers = get_burgers(2) burgers = get_burgers(2)
``` ```
--- ---
Donc, si vous utilisez une bibliothÚque qui nécessite que ses fonctions soient appelées avec `await`, vous devez définir la *fonction de chemin d'accÚs* en utilisant `async def` comme dans : Donc, si vous utilisez une bibliothÚque qui vous indique que vous pouvez l'appeler avec `await`, vous devez créer les *fonctions de chemin d'accÚs* qui l'utilisent avec `async def`, comme dans :
```Python hl_lines="2-3" ```Python hl_lines="2-3"
@app.get('/burgers') @app.get('/burgers')
@ -351,13 +351,13 @@ async def read_burgers():
### Plus de détails techniques { #more-technical-details } ### Plus de détails techniques { #more-technical-details }
Vous avez donc compris que `await` peut seulement ĂȘtre utilisĂ© dans des fonctions dĂ©finies avec `async def`. Vous avez peut-ĂȘtre remarquĂ© que `await` peut seulement ĂȘtre utilisĂ© dans des fonctions dĂ©finies avec `async def`.
Mais en mĂȘme temps, les fonctions dĂ©finies avec `async def` doivent ĂȘtre appelĂ©es avec `await` et donc dans des fonctions dĂ©finies elles aussi avec `async def`. Mais en mĂȘme temps, les fonctions dĂ©finies avec `async def` doivent ĂȘtre « attendues ». Donc, les fonctions avec `async def` peuvent seulement ĂȘtre appelĂ©es Ă  l'intĂ©rieur de fonctions dĂ©finies elles aussi avec `async def`.
Vous avez donc remarquĂ© ce paradoxe d'Ɠuf et de la poule, comment appelle-t-on la premiĂšre fonction `async` ? Donc, Ă  propos de l'Ɠuf et de la poule, comment appelle-t-on la premiĂšre fonction `async` ?
Si vous utilisez **FastAPI**, pas besoin de vous en inquiéter, car cette « premiÚre » fonction sera votre *fonction de chemin d'accÚs* ; et **FastAPI** saura comment arriver au résultat attendu. Si vous utilisez **FastAPI**, pas besoin de vous en inquiéter, car cette « premiÚre » fonction sera votre *fonction de chemin d'accÚs*, et FastAPI saura comment faire ce qu'il faut.
Mais si vous souhaitez utiliser `async` / `await` sans FastAPI, vous pouvez également le faire. Mais si vous souhaitez utiliser `async` / `await` sans FastAPI, vous pouvez également le faire.
@ -367,7 +367,7 @@ Starlette (et **FastAPI**) s’appuie sur [AnyIO](https://anyio.readthedocs.io/e
En particulier, vous pouvez utiliser directement [AnyIO](https://anyio.readthedocs.io/en/stable/) pour vos cas d’usage de concurrence avancĂ©s qui nĂ©cessitent des schĂ©mas plus Ă©laborĂ©s dans votre propre code. En particulier, vous pouvez utiliser directement [AnyIO](https://anyio.readthedocs.io/en/stable/) pour vos cas d’usage de concurrence avancĂ©s qui nĂ©cessitent des schĂ©mas plus Ă©laborĂ©s dans votre propre code.
Et mĂȘme si vous n’utilisiez pas FastAPI, vous pourriez aussi Ă©crire vos propres applications async avec [AnyIO](https://anyio.readthedocs.io/en/stable/) pour une grande compatibilitĂ© et pour bĂ©nĂ©ficier de ses avantages (par ex. la « structured concurrency »). Et mĂȘme si vous n’utilisiez pas FastAPI, vous pourriez aussi Ă©crire vos propres applications async avec [AnyIO](https://anyio.readthedocs.io/en/stable/) pour une grande compatibilitĂ© et pour bĂ©nĂ©ficier de ses avantages (par ex. la *structured concurrency*).
J’ai créé une autre bibliothĂšque au-dessus d’AnyIO, comme une fine surcouche, pour amĂ©liorer un peu les annotations de type et obtenir une meilleure **autocomplĂ©tion**, des **erreurs en ligne**, etc. Elle propose Ă©galement une introduction et un tutoriel accessibles pour vous aider Ă  **comprendre** et Ă©crire **votre propre code async** : [Asyncer](https://asyncer.tiangolo.com/). Elle sera particuliĂšrement utile si vous devez **combiner du code async avec du code classique** (bloquant/synchrone). J’ai créé une autre bibliothĂšque au-dessus d’AnyIO, comme une fine surcouche, pour amĂ©liorer un peu les annotations de type et obtenir une meilleure **autocomplĂ©tion**, des **erreurs en ligne**, etc. Elle propose Ă©galement une introduction et un tutoriel accessibles pour vous aider Ă  **comprendre** et Ă©crire **votre propre code async** : [Asyncer](https://asyncer.tiangolo.com/). Elle sera particuliĂšrement utile si vous devez **combiner du code async avec du code classique** (bloquant/synchrone).
@ -377,25 +377,25 @@ L'utilisation d'`async` et `await` est relativement nouvelle dans ce langage.
Mais cela rend la programmation asynchrone bien plus simple. Mais cela rend la programmation asynchrone bien plus simple.
Cette mĂȘme syntaxe (ou presque) a aussi Ă©tĂ© incluse rĂ©cemment dans les versions modernes de JavaScript (dans les navigateurs et NodeJS). Cette mĂȘme syntaxe (ou presque) a aussi Ă©tĂ© incluse rĂ©cemment dans les versions modernes de JavaScript (dans le navigateur et NodeJS).
Mais avant ça, gérer du code asynchrone était bien plus complexe et difficile. Mais avant ça, gérer du code asynchrone était bien plus complexe et difficile.
Dans les versions précédentes de Python, vous auriez utilisé des threads ou [Gevent](https://www.gevent.org/). Mais le code aurait été bien plus difficile à comprendre, débugger, et concevoir. Dans les versions précédentes de Python, vous auriez pu utiliser des threads ou [Gevent](https://www.gevent.org/). Mais le code est bien plus difficile à comprendre, débugger, et concevoir.
Dans les versions précédentes de JavaScript cÎté navigateur / NodeJS, vous auriez utilisé des « callbacks ». Menant potentiellement à ce que l'on appelle le « callback hell ». Dans les versions précédentes de NodeJS / JavaScript de navigateur, vous auriez utilisé des « callbacks ». Ce qui mÚne au « callback hell ».
## Coroutines { #coroutines } ## Coroutines { #coroutines }
« Coroutine » est juste un terme Ă©laborĂ© pour dĂ©signer ce qui est retournĂ© par une fonction dĂ©finie avec `async def`. Python sait que c'est comme une fonction classique qui va dĂ©marrer Ă  un moment et terminer Ă  un autre, mais qu'elle peut aussi ĂȘtre mise en pause ⏞, du moment qu'il y a un `await` dans son contenu. **Coroutine** est juste un terme Ă©laborĂ© pour dĂ©signer ce qui est retournĂ© par une fonction dĂ©finie avec `async def`. Python sait que c'est comme une fonction, qui peut dĂ©marrer et qui se terminera Ă  un moment, mais qu'elle peut aussi ĂȘtre mise en pause ⏞ en interne, quand il y a un `await` Ă  l'intĂ©rieur.
Mais toutes ces fonctionnalités d'utilisation de code asynchrone avec `async` et `await` sont souvent résumées comme l'utilisation des « coroutines ». On peut comparer cela à la principale fonctionnalité clé de Go, les « Goroutines ». Mais toutes ces fonctionnalités d'utilisation de code asynchrone avec `async` et `await` sont souvent résumées comme l'utilisation des « coroutines ». On peut comparer cela à la principale fonctionnalité clé de Go, les « Goroutines ».
## Conclusion { #conclusion } ## Conclusion { #conclusion }
Reprenons la phrase du dĂ©but de la page : Reprenons la mĂȘme phrase ci-dessus :
> Les versions modernes de Python supportent le **code asynchrone** grùce aux **« coroutines »** avec les syntaxes **`async` et `await`**. > Les versions modernes de Python supportent le **« code asynchrone »** en utilisant quelque chose appelé **« coroutines »**, avec la syntaxe **`async` et `await`**.
Ceci devrait ĂȘtre plus comprĂ©hensible dĂ©sormais. ✹ Ceci devrait ĂȘtre plus comprĂ©hensible dĂ©sormais. ✹
@ -409,25 +409,25 @@ Vous pouvez probablement ignorer cela.
Ce sont des détails trÚs poussés sur comment **FastAPI** fonctionne en arriÚre-plan. Ce sont des détails trÚs poussés sur comment **FastAPI** fonctionne en arriÚre-plan.
Si vous avez de bonnes connaissances techniques (coroutines, threads, code bloquant, etc.) et ĂȘtes curieux de comment **FastAPI** gĂšre `async def` versus le `def` classique, cette partie est faite pour vous. Si vous avez de bonnes connaissances techniques (coroutines, threads, code bloquant, etc.) et ĂȘtes curieux de comment FastAPI gĂšre `async def` versus le `def` classique, cette partie est faite pour vous.
/// ///
### Fonctions de chemin d'accĂšs { #path-operation-functions } ### Fonctions de chemin d'accĂšs { #path-operation-functions }
Quand vous dĂ©clarez une *fonction de chemin d'accĂšs* avec un `def` normal et non `async def`, elle est exĂ©cutĂ©e dans un groupe de threads (threadpool) externe qui est ensuite attendu, plutĂŽt que d'ĂȘtre appelĂ©e directement (car cela bloquerait le serveur). Quand vous dĂ©clarez une *fonction de chemin d'accĂšs* avec un `def` normal et non `async def`, elle est exĂ©cutĂ©e dans une threadpool externe qui est ensuite attendue, plutĂŽt que d'ĂȘtre appelĂ©e directement (car cela bloquerait le serveur).
Si vous venez d'un autre framework asynchrone qui ne fonctionne pas comme de la façon dĂ©crite ci-dessus et que vous ĂȘtes habituĂ© Ă  dĂ©finir des *fonctions de chemin d'accĂšs* basiques et purement calculatoires avec un simple `def` pour un faible gain de performance (environ 100 nanosecondes), veuillez noter que dans **FastAPI**, l'effet serait plutĂŽt contraire. Dans ces cas-lĂ , il vaut mieux utiliser `async def` Ă  moins que votre *fonction de chemin d'accĂšs* utilise du code qui effectue des opĂ©rations <abbr title="Input/Output - EntrĂ©es/Sorties: lecture ou Ă©criture sur le disque, communications rĂ©seau.">I/O</abbr> bloquantes. Si vous venez d'un autre framework async qui ne fonctionne pas de la façon dĂ©crite ci-dessus et que vous ĂȘtes habituĂ© Ă  dĂ©finir des *fonctions de chemin d'accĂšs* triviales faisant uniquement du calcul avec un simple `def` pour un faible gain de performance (environ 100 nanosecondes), veuillez noter que dans **FastAPI**, l'effet serait plutĂŽt contraire. Dans ces cas-lĂ , il vaut mieux utiliser `async def` Ă  moins que vos *fonctions de chemin d'accĂšs* utilisent du code qui effectue des opĂ©rations <abbr title="Input/Output - EntrĂ©es/Sorties: lecture ou Ă©criture sur le disque, communications rĂ©seau.">I/O</abbr> bloquantes.
Au final, dans les deux situations, il est fort probable que **FastAPI** soit tout de mĂȘme [plus rapide](index.md#performance) que (ou au moins de vitesse Ă©gale Ă ) votre framework prĂ©cĂ©dent. Au final, dans les deux situations, il est fort probable que **FastAPI** soit [tout de mĂȘme plus rapide](index.md#performance) que (ou au moins comparable Ă ) votre framework prĂ©cĂ©dent.
### Dépendances { #dependencies } ### Dépendances { #dependencies }
La mĂȘme chose s'applique aux [dĂ©pendances](tutorial/dependencies/index.md). Si une dĂ©pendance est dĂ©finie avec `def` plutĂŽt que `async def`, elle est exĂ©cutĂ©e dans la threadpool externe. La mĂȘme chose s'applique aux [dĂ©pendances](tutorial/dependencies/index.md). Si une dĂ©pendance est une fonction standard `def` plutĂŽt qu'`async def`, elle est exĂ©cutĂ©e dans la threadpool externe.
### Sous-dépendances { #sub-dependencies } ### Sous-dépendances { #sub-dependencies }
Vous pouvez avoir de multiples dĂ©pendances et [sous-dĂ©pendances](tutorial/dependencies/sub-dependencies.md) dĂ©pendant les unes des autres (en tant que paramĂštres de la dĂ©finition de la *fonction de chemin d'accĂšs*), certaines créées avec `async def` et d'autres avec `def`. Cela fonctionnerait aussi, et celles dĂ©finies avec un simple `def` seraient exĂ©cutĂ©es sur un thread externe (venant de la threadpool) plutĂŽt que d'ĂȘtre « attendues ». Vous pouvez avoir de multiples dĂ©pendances et [sous-dĂ©pendances](tutorial/dependencies/sub-dependencies.md) dĂ©pendant les unes des autres (en tant que paramĂštres des dĂ©finitions des fonctions), certaines créées avec `async def` et d'autres avec un `def` normal. Cela fonctionnerait aussi, et celles dĂ©finies avec un `def` normal seraient appelĂ©es sur un thread externe (venant de la threadpool) plutĂŽt que d'ĂȘtre « attendues ».
### Autres fonctions utilitaires { #other-utility-functions } ### Autres fonctions utilitaires { #other-utility-functions }
@ -435,10 +435,10 @@ Toute autre fonction utilitaire que vous appelez directement peut ĂȘtre créée
Contrairement aux fonctions que FastAPI appelle pour vous : les *fonctions de chemin d'accÚs* et dépendances. Contrairement aux fonctions que FastAPI appelle pour vous : les *fonctions de chemin d'accÚs* et dépendances.
Si votre fonction utilitaire est une fonction classique définie avec `def`, elle sera appelée directement (telle qu'écrite dans votre code), pas dans une threadpool ; si la fonction est définie avec `async def` alors vous devrez attendre (avec `await`) que cette fonction se termine avant de passer à la suite du code. Si votre fonction utilitaire est une fonction classique définie avec `def`, elle sera appelée directement (telle qu'écrite dans votre code), pas dans une threadpool ; si la fonction est définie avec `async def` alors vous devez `await` cette fonction lorsque vous l'appelez dans votre code.
--- ---
Encore une fois, ce sont des dĂ©tails trĂšs techniques qui peuvent ĂȘtre utiles si vous venez ici les chercher. Encore une fois, ce sont des dĂ©tails trĂšs techniques qui peuvent ĂȘtre utiles si vous venez ici les chercher.
Sinon, les instructions de la section <a href="#in-a-hurry">Vous ĂȘtes pressĂ©s ?</a> ci-dessus sont largement suffisantes. Sinon, les instructions de la section ci-dessus sont largement suffisantes : <a href="#in-a-hurry">Vous ĂȘtes pressĂ©s ?</a>.

4
docs/fr/docs/deployment/cloud.md

@ -1,6 +1,6 @@
# Déployer FastAPI sur des fournisseurs cloud { #deploy-fastapi-on-cloud-providers } # Déployer FastAPI sur des fournisseurs cloud { #deploy-fastapi-on-cloud-providers }
Vous pouvez utiliser pratiquement n'importe quel fournisseur cloud pour déployer votre application FastAPI. Vous pouvez utiliser pratiquement **n'importe quel fournisseur cloud** pour déployer votre application FastAPI.
Dans la plupart des cas, les principaux fournisseurs cloud proposent des guides pour déployer FastAPI avec leurs services. Dans la plupart des cas, les principaux fournisseurs cloud proposent des guides pour déployer FastAPI avec leurs services.
@ -16,7 +16,7 @@ FastAPI Cloud est le sponsor principal et le financeur des projets open source *
## Fournisseurs cloud - Sponsors { #cloud-providers-sponsors } ## Fournisseurs cloud - Sponsors { #cloud-providers-sponsors }
D'autres fournisseurs cloud ✹ [**parrainent FastAPI**](../help-fastapi.md#sponsor-the-author) ✹ Ă©galement. 🙇 Certains autres fournisseurs cloud ✹ [**parrainent FastAPI**](https://github.com/sponsors/tiangolo) ✹ Ă©galement. 🙇
Vous pouvez également envisager ces fournisseurs pour suivre leurs guides et essayer leurs services : Vous pouvez également envisager ces fournisseurs pour suivre leurs guides et essayer leurs services :

1
docs/fr/docs/deployment/concepts.md

@ -1,5 +1,6 @@
# Concepts de déploiement { #deployments-concepts } # Concepts de déploiement { #deployments-concepts }
Lorsque vous déployez une application **FastAPI**, ou en fait n'importe quel type de web API, il existe plusieurs concepts qui vous importent probablement, et en les utilisant vous pouvez trouver la maniÚre la **plus appropriée** de **déployer votre application**. Lorsque vous déployez une application **FastAPI**, ou en fait n'importe quel type de web API, il existe plusieurs concepts qui vous importent probablement, et en les utilisant vous pouvez trouver la maniÚre la **plus appropriée** de **déployer votre application**.
Parmi les concepts importants, on trouve : Parmi les concepts importants, on trouve :

4
docs/fr/docs/deployment/docker.md

@ -232,7 +232,7 @@ Passez en revue ce que fait chaque ligne en cliquant sur chaque bulle numéroté
/// warning | Alertes /// warning | Alertes
Vous devez vous assurer d'utiliser **toujours** la **forme exec** de l'instruction `CMD`, comme expliqué ci-dessous. Vous devez **toujours** utiliser la **forme exec** de l'instruction `CMD`, comme expliqué ci-dessous.
/// ///
@ -254,7 +254,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
CMD fastapi run app/main.py --port 80 CMD fastapi run app/main.py --port 80
``` ```
Assurez-vous d'utiliser toujours la forme **exec** pour garantir que FastAPI peut s'arrĂȘter proprement et que les [Ă©vĂ©nements de cycle de vie](../advanced/events.md) sont dĂ©clenchĂ©s. Vous devez toujours utiliser la forme **exec** pour garantir que FastAPI peut s'arrĂȘter proprement et que les [Ă©vĂ©nements de cycle de vie](../advanced/events.md) sont dĂ©clenchĂ©s.
Vous pouvez en lire davantage dans la [documentation Docker sur les formes shell et exec](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). Vous pouvez en lire davantage dans la [documentation Docker sur les formes shell et exec](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form).

6
docs/fr/docs/deployment/https.md

@ -10,9 +10,9 @@ Si vous ĂȘtes pressĂ© ou si cela ne vous intĂ©resse pas, continuez avec les sect
/// ///
Pour apprendre les bases du HTTPS, du point de vue d'un utilisateur, consultez [https://howhttps.works/](https://howhttps.works/). Pour **apprendre les bases du HTTPS**, du point de vue d'un utilisateur, consultez [https://howhttps.works/](https://howhttps.works/).
Maintenant, du point de vue d'un dĂ©veloppeur, voici plusieurs choses Ă  avoir en tĂȘte en pensant au HTTPS : Maintenant, du **point de vue d'un dĂ©veloppeur**, voici plusieurs choses Ă  avoir en tĂȘte en pensant au HTTPS :
* Pour le HTTPS, **le serveur** doit **disposer de « certificats »** générés par une **tierce partie**. * Pour le HTTPS, **le serveur** doit **disposer de « certificats »** générés par une **tierce partie**.
* Ces certificats sont en réalité **acquis** auprÚs de la tierce partie, et non « générés ». * Ces certificats sont en réalité **acquis** auprÚs de la tierce partie, et non « générés ».
@ -65,7 +65,7 @@ Voici un exemple de ce à quoi pourrait ressembler une API HTTPS, étape par ét
Tout commencerait probablement par le fait que vous **acquĂ©riez** un **nom de domaine**. Ensuite, vous le configureriez dans un serveur DNS (possiblement le mĂȘme que votre fournisseur cloud). Tout commencerait probablement par le fait que vous **acquĂ©riez** un **nom de domaine**. Ensuite, vous le configureriez dans un serveur DNS (possiblement le mĂȘme que votre fournisseur cloud).
Vous obtiendriez probablement un serveur cloud (une machine virtuelle) ou quelque chose de similaire, et il aurait une adresse IP publique <dfn title="Ne change pas dans le temps. Pas dynamique.">fixe</dfn>. Vous obtiendriez probablement un serveur cloud (une machine virtuelle) ou quelque chose de similaire, et il aurait une **adresse IP publique** <dfn title="Ne change pas dans le temps. Pas dynamique.">fixe</dfn>.
Dans le ou les serveurs DNS, vous configureriez un enregistrement (un « `A record` ») pour faire pointer **votre domaine** vers l'**adresse IP publique de votre serveur**. Dans le ou les serveurs DNS, vous configureriez un enregistrement (un « `A record` ») pour faire pointer **votre domaine** vers l'**adresse IP publique de votre serveur**.

10
docs/fr/docs/deployment/manually.md

@ -40,7 +40,7 @@ $ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid
Cela fonctionnerait pour la plupart des cas. 😎 Cela fonctionnerait pour la plupart des cas. 😎
Vous pourriez utiliser cette commande par exemple pour démarrer votre application **FastAPI** dans un conteneur, sur un serveur, etc. Vous pourriez utiliser cette commande par exemple pour démarrer votre **FastAPI** app dans un conteneur, sur un serveur, etc.
## Serveurs ASGI { #asgi-servers } ## Serveurs ASGI { #asgi-servers }
@ -48,7 +48,7 @@ Allons un peu plus en détail.
FastAPI utilise un standard pour construire des frameworks web Python et des serveurs appelé <abbr title="Asynchronous Server Gateway Interface - Interface passerelle serveur asynchrone">ASGI</abbr>. FastAPI est un framework web ASGI. FastAPI utilise un standard pour construire des frameworks web Python et des serveurs appelé <abbr title="Asynchronous Server Gateway Interface - Interface passerelle serveur asynchrone">ASGI</abbr>. FastAPI est un framework web ASGI.
La principale chose dont vous avez besoin pour exécuter une application **FastAPI** (ou toute autre application ASGI) sur une machine serveur distante est un programme serveur ASGI comme **Uvicorn**, c'est celui utilisé par défaut par la commande `fastapi`. La principale chose dont vous avez besoin pour exécuter une application **FastAPI** (ou toute autre application ASGI) sur une machine serveur distante est un programme serveur ASGI comme **Uvicorn**, c'est celui fourni par défaut avec la commande `fastapi`.
Il existe plusieurs alternatives, notamment : Il existe plusieurs alternatives, notamment :
@ -61,9 +61,9 @@ Il existe plusieurs alternatives, notamment :
Il y a un petit dĂ©tail sur les noms Ă  garder Ă  l'esprit. 💡 Il y a un petit dĂ©tail sur les noms Ă  garder Ă  l'esprit. 💡
Le mot « serveur » est couramment utilisé pour désigner à la fois l'ordinateur distant/cloud (la machine physique ou virtuelle) et également le programme qui s'exécute sur cette machine (par exemple, Uvicorn). Le mot « **serveur** » est couramment utilisé pour désigner à la fois l'ordinateur distant/cloud (la machine physique ou virtuelle) et également le programme qui s'exécute sur cette machine (par exemple, Uvicorn).
Gardez cela à l'esprit lorsque vous lisez « serveur » en général, cela pourrait faire référence à l'une de ces deux choses. Gardez simplement à l'esprit que lorsque vous lisez « serveur » en général, cela pourrait faire référence à l'une de ces deux choses.
Lorsqu'on se rĂ©fĂšre Ă  la machine distante, il est courant de l'appeler **serveur**, mais aussi **machine**, **VM** (machine virtuelle), **nƓud**. Tout cela fait rĂ©fĂ©rence Ă  un type de machine distante, exĂ©cutant normalement Linux, sur laquelle vous exĂ©cutez des programmes. Lorsqu'on se rĂ©fĂšre Ă  la machine distante, il est courant de l'appeler **serveur**, mais aussi **machine**, **VM** (machine virtuelle), **nƓud**. Tout cela fait rĂ©fĂ©rence Ă  un type de machine distante, exĂ©cutant normalement Linux, sur laquelle vous exĂ©cutez des programmes.
@ -117,7 +117,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 80
La commande `uvicorn main:app` fait référence à : La commande `uvicorn main:app` fait référence à :
* `main` : le fichier `main.py` (le « module » Python). * `main` : le fichier `main.py` (le « module » Python).
* `app` : l'objet créé dans `main.py` avec la ligne `app = FastAPI()`. * `app` : l'objet créé dans `main.py` avec la ligne `app = FastAPI()`.
C'est équivalent à : C'est équivalent à :

2
docs/fr/docs/editor-support.md

@ -1,6 +1,6 @@
# Prise en charge des éditeurs { #editor-support } # 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. 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). Pour plus de dĂ©tails sur l’extension, reportez-vous au README sur le [rĂ©fĂ©rentiel GitHub](https://github.com/fastapi/fastapi-vscode).

28
docs/fr/docs/environment-variables.md

@ -6,13 +6,13 @@ Si vous savez déjà ce que sont les « variables d'environnement » et comment
/// ///
Une variable d'environnement (Ă©galement appelĂ©e « env var ») est une variable qui vit en dehors du code Python, dans le systĂšme d'exploitation, et qui peut ĂȘtre lue par votre code Python (ou par d'autres programmes Ă©galement). Une variable d'environnement (Ă©galement appelĂ©e « **env var** ») est une variable qui vit **en dehors** du code Python, dans le **systĂšme d'exploitation**, et qui peut ĂȘtre lue par votre code Python (ou par d'autres programmes Ă©galement).
Les variables d'environnement peuvent ĂȘtre utiles pour gĂ©rer des **paramĂštres** d'application, dans le cadre de l'**installation** de Python, etc. Les variables d'environnement peuvent ĂȘtre utiles pour gĂ©rer des **paramĂštres** d'application, dans le cadre de l'**installation** de Python, etc.
## Créer et utiliser des variables d'environnement { #create-and-use-env-vars } ## Créer et utiliser des variables d'environnement { #create-and-use-env-vars }
Vous pouvez créer et utiliser des variables d'environnement dans le **shell (terminal)**, sans avoir besoin de Python : Vous pouvez **créer** et utiliser des variables d'environnement dans le **shell (terminal)**, sans avoir besoin de Python :
//// tab | Linux, macOS, Windows Bash //// tab | Linux, macOS, Windows Bash
@ -54,7 +54,7 @@ Hello Wade Wilson
Vous pouvez également créer des variables d'environnement **en dehors** de Python, dans le terminal (ou par tout autre moyen), puis les **lire en Python**. Vous pouvez également créer des variables d'environnement **en dehors** de Python, dans le terminal (ou par tout autre moyen), puis les **lire en Python**.
Par exemple, vous pouvez avoir un fichier `main.py` contenant : Par exemple, vous pouvez avoir un fichier `main.py` contenant :
```Python hl_lines="3" ```Python hl_lines="3"
import os import os
@ -71,7 +71,7 @@ S'il n'est pas fourni, c'est `None` par défaut ; ici, nous fournissons `"World"
/// ///
Vous pouvez ensuite exécuter ce programme Python : Vous pouvez ensuite exécuter ce programme Python :
//// tab | Linux, macOS, Windows Bash //// tab | Linux, macOS, Windows Bash
@ -131,7 +131,7 @@ Comme les variables d'environnement peuvent ĂȘtre dĂ©finies en dehors du code, m
Vous pouvez également créer une variable d'environnement uniquement pour l'**invocation d'un programme spécifique**, qui ne sera disponible que pour ce programme et uniquement pendant sa durée d'exécution. Vous pouvez également créer une variable d'environnement uniquement pour l'**invocation d'un programme spécifique**, qui ne sera disponible que pour ce programme et uniquement pendant sa durée d'exécution.
Pour cela, crĂ©ez-la juste avant le programme, sur la mĂȘme ligne : Pour cela, crĂ©ez-la juste avant le programme, sur la mĂȘme ligne :
<div class="termy"> <div class="termy">
@ -159,7 +159,7 @@ Vous pouvez en lire davantage sur [The Twelve-Factor App : Config](https://12fac
## Gérer les types et la validation { #types-and-validation } ## Gérer les types et la validation { #types-and-validation }
Ces variables d'environnement ne peuvent gĂ©rer que des **chaĂźnes de texte**, car elles sont externes Ă  Python et doivent ĂȘtre compatibles avec les autres programmes et le reste du systĂšme (et mĂȘme avec diffĂ©rents systĂšmes d'exploitation, comme Linux, Windows, macOS). Ces variables d'environnement ne peuvent gĂ©rer que des **chaĂźnes de texte**, car elles sont externes Ă  Python et doivent ĂȘtre compatibles avec les autres programmes et le reste du systĂšme (et mĂȘme avec diffĂ©rents systĂšmes d'exploitation, comme Linux, Windows et macOS).
Cela signifie que **toute valeur** lue en Python Ă  partir d'une variable d'environnement **sera une `str`**, et que toute conversion vers un autre type ou toute validation doit ĂȘtre effectuĂ©e dans le code. Cela signifie que **toute valeur** lue en Python Ă  partir d'une variable d'environnement **sera une `str`**, et que toute conversion vers un autre type ou toute validation doit ĂȘtre effectuĂ©e dans le code.
@ -167,11 +167,11 @@ Vous en apprendrez davantage sur l'utilisation des variables d'environnement pou
## Variable d'environnement `PATH` { #path-environment-variable } ## Variable d'environnement `PATH` { #path-environment-variable }
Il existe une **variable d'environnement spéciale** appelée **`PATH`** qui est utilisée par les systÚmes d'exploitation (Linux, macOS, Windows) pour trouver les programmes à exécuter. Il existe une variable d'environnement **spéciale** appelée **`PATH`** qui est utilisée par les systÚmes d'exploitation (Linux, macOS, Windows) pour trouver les programmes à exécuter.
La valeur de la variable `PATH` est une longue chaßne composée de répertoires séparés par deux-points `:` sous Linux et macOS, et par point-virgule `;` sous Windows. La valeur de la variable `PATH` est une longue chaßne composée de répertoires séparés par deux-points `:` sous Linux et macOS, et par point-virgule `;` sous Windows.
Par exemple, la variable d'environnement `PATH` peut ressembler à ceci : Par exemple, la variable d'environnement `PATH` peut ressembler à ceci :
//// tab | Linux, macOS //// tab | Linux, macOS
@ -179,7 +179,7 @@ Par exemple, la variable d'environnement `PATH` peut ressembler à ceci :
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
``` ```
Cela signifie que le systÚme doit rechercher les programmes dans les répertoires : Cela signifie que le systÚme doit rechercher les programmes dans les répertoires :
* `/usr/local/bin` * `/usr/local/bin`
* `/usr/bin` * `/usr/bin`
@ -195,7 +195,7 @@ Cela signifie que le systÚme doit rechercher les programmes dans les répertoir
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32
``` ```
Cela signifie que le systÚme doit rechercher les programmes dans les répertoires : Cela signifie que le systÚme doit rechercher les programmes dans les répertoires :
* `C:\Program Files\Python312\Scripts` * `C:\Program Files\Python312\Scripts`
* `C:\Program Files\Python312` * `C:\Program Files\Python312`
@ -219,7 +219,7 @@ Supposons que vous installiez Python et qu'il se retrouve dans un répertoire `/
Si vous acceptez de mettre Ă  jour la variable d'environnement `PATH`, l'installateur ajoutera `/opt/custompython/bin` Ă  la variable d'environnement `PATH`. Si vous acceptez de mettre Ă  jour la variable d'environnement `PATH`, l'installateur ajoutera `/opt/custompython/bin` Ă  la variable d'environnement `PATH`.
Cela pourrait ressembler à ceci : Cela pourrait ressembler à ceci :
```plaintext ```plaintext
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin
@ -243,7 +243,7 @@ Ainsi, lorsque vous tapez `python` dans le terminal, le systĂšme trouvera le pro
//// ////
Ainsi, si vous tapez : Ainsi, si vous tapez :
<div class="termy"> <div class="termy">
@ -257,7 +257,7 @@ $ python
Le systÚme va **trouver** le programme `python` dans `/opt/custompython/bin` et l'exécuter. Le systÚme va **trouver** le programme `python` dans `/opt/custompython/bin` et l'exécuter.
Cela reviendrait à peu prÚs à taper : Cela reviendrait à peu prÚs à taper :
<div class="termy"> <div class="termy">
@ -273,7 +273,7 @@ $ /opt/custompython/bin/python
Le systÚme va **trouver** le programme `python` dans `C:\opt\custompython\bin\python` et l'exécuter. Le systÚme va **trouver** le programme `python` dans `C:\opt\custompython\bin\python` et l'exécuter.
Cela reviendrait à peu prÚs à taper : Cela reviendrait à peu prÚs à taper :
<div class="termy"> <div class="termy">

8
docs/fr/docs/features.md

@ -17,7 +17,7 @@ Documentation d'API interactive et interfaces web d'exploration. Comme le framew
* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), avec exploration interactive, appelez et testez votre API directement depuis le navigateur. * [**Swagger UI**](https://github.com/swagger-api/swagger-ui), avec exploration interactive, appelez et testez votre API directement depuis le navigateur.
![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) ![interaction avec Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
* Documentation d'API alternative avec [**ReDoc**](https://github.com/Rebilly/ReDoc). * Documentation d'API alternative avec [**ReDoc**](https://github.com/Rebilly/ReDoc).
@ -85,11 +85,11 @@ Voici comment votre éditeur peut vous aider :
* dans [Visual Studio Code](https://code.visualstudio.com/) : * dans [Visual Studio Code](https://code.visualstudio.com/) :
![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) ![support de l'éditeur](https://fastapi.tiangolo.com/img/vscode-completion.png)
* dans [PyCharm](https://www.jetbrains.com/pycharm/) : * dans [PyCharm](https://www.jetbrains.com/pycharm/) :
![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) ![support de l'éditeur](https://fastapi.tiangolo.com/img/pycharm-completion.png)
Vous obtiendrez de l'autocomplĂ©tion dans du code que vous auriez pu considĂ©rer impossible auparavant. Par exemple, la clĂ© `price` Ă  l'intĂ©rieur d'un corps JSON (qui aurait pu ĂȘtre imbriquĂ©) provenant d'une requĂȘte. Vous obtiendrez de l'autocomplĂ©tion dans du code que vous auriez pu considĂ©rer impossible auparavant. Par exemple, la clĂ© `price` Ă  l'intĂ©rieur d'un corps JSON (qui aurait pu ĂȘtre imbriquĂ©) provenant d'une requĂȘte.
@ -105,7 +105,7 @@ Mais par défaut, tout **« just works »**.
* Validation pour la plupart (ou tous ?) des **types de données** Python, y compris : * Validation pour la plupart (ou tous ?) des **types de données** Python, y compris :
* objets JSON (`dict`). * objets JSON (`dict`).
* tableaux JSON (`list`) définissant les types d'éléments. * tableau JSON (`list`) définissant les types d'éléments.
* champs String (`str`), définition des longueurs minimale et maximale. * champs String (`str`), définition des longueurs minimale et maximale.
* nombres (`int`, `float`) avec valeurs minimale et maximale, etc. * nombres (`int`, `float`) avec valeurs minimale et maximale, etc.

1
docs/fr/docs/help-fastapi.md

@ -1,5 +1,6 @@
# Aider { #help } # Aider { #help }
Souhaitez-vous aider FastAPI ou obtenir de l'aide Ă  propos de FastAPI ? Souhaitez-vous aider FastAPI ou obtenir de l'aide Ă  propos de FastAPI ?
Il existe des moyens trĂšs simples d'aider et d'obtenir de l'aide. Il existe des moyens trĂšs simples d'aider et d'obtenir de l'aide.

4
docs/fr/docs/how-to/configure-swagger-ui.md

@ -50,11 +50,11 @@ Par exemple, pour désactiver `deepLinking`, vous pourriez passer ces paramÚtre
## Autres paramĂštres de Swagger UI { #other-swagger-ui-parameters } ## Autres paramĂštres de Swagger UI { #other-swagger-ui-parameters }
Pour voir toutes les autres configurations possibles que vous pouvez utiliser, lisez les [documents officiels pour les paramĂštres de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). Pour voir toutes les autres configurations possibles que vous pouvez utiliser, lisez les documents officiels [pour les paramĂštres de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/).
## ParamĂštres JavaScript uniquement { #javascript-only-settings } ## ParamĂštres JavaScript uniquement { #javascript-only-settings }
Swagger UI permet également d'autres configurations qui sont des objets réservés à JavaScript (par exemple, des fonctions JavaScript). Swagger UI permet également d'autres configurations qui sont des objets **réservés à JavaScript** (par exemple, des fonctions JavaScript).
FastAPI inclut aussi ces paramÚtres `presets` réservés à JavaScript : FastAPI inclut aussi ces paramÚtres `presets` réservés à JavaScript :

2
docs/fr/docs/how-to/custom-request-and-route.md

@ -66,7 +66,7 @@ Le `dict` `scope` et la fonction `receive` font tous deux partie de la spécific
Et ces deux éléments, `scope` et `receive`, sont ce dont on a besoin pour créer une nouvelle instance de `Request`. Et ces deux éléments, `scope` et `receive`, sont ce dont on a besoin pour créer une nouvelle instance de `Request`.
Pour en savoir plus sur `Request`, consultez [la documentation de Starlette sur les requĂȘtes](https://www.starlette.dev/requests/). Pour en savoir plus sur `Request`, consultez [les documents de Starlette sur les requĂȘtes](https://www.starlette.dev/requests/).
/// ///

6
docs/fr/docs/how-to/graphql.md

@ -19,9 +19,9 @@ Assurez-vous d'évaluer si les **bénéfices** pour votre cas d'utilisation comp
Voici quelques bibliothĂšques **GraphQL** qui prennent en charge **ASGI**. Vous pouvez les utiliser avec **FastAPI** : Voici quelques bibliothĂšques **GraphQL** qui prennent en charge **ASGI**. Vous pouvez les utiliser avec **FastAPI** :
* [Strawberry](https://strawberry.rocks/) 🍓 * [Strawberry](https://strawberry.rocks/) 🍓
* Avec [la documentation pour FastAPI](https://strawberry.rocks/docs/integrations/fastapi) * Avec [les documents pour FastAPI](https://strawberry.rocks/docs/integrations/fastapi)
* [Ariadne](https://ariadnegraphql.org/) * [Ariadne](https://ariadnegraphql.org/)
* Avec [la documentation pour FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) * Avec [les documents pour FastAPI](https://ariadnegraphql.org/docs/fastapi-integration)
* [Tartiflette](https://tartiflette.io/) * [Tartiflette](https://tartiflette.io/)
* Avec [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) pour fournir l'intégration ASGI * Avec [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) pour fournir l'intégration ASGI
* [Graphene](https://graphene-python.org/) * [Graphene](https://graphene-python.org/)
@ -39,7 +39,7 @@ Voici un petit aperçu de la maniÚre dont vous pouvez intégrer Strawberry avec
Vous pouvez en apprendre davantage sur Strawberry dans la [documentation de Strawberry](https://strawberry.rocks/). Vous pouvez en apprendre davantage sur Strawberry dans la [documentation de Strawberry](https://strawberry.rocks/).
Et également la documentation sur [Strawberry avec FastAPI](https://strawberry.rocks/docs/integrations/fastapi). Et également les documents sur [Strawberry avec FastAPI](https://strawberry.rocks/docs/integrations/fastapi).
## Ancien `GraphQLApp` de Starlette { #older-graphqlapp-from-starlette } ## Ancien `GraphQLApp` de Starlette { #older-graphqlapp-from-starlette }

18
docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md

@ -8,6 +8,8 @@ FastAPI version 0.119.0 a introduit une prise en charge partielle de Pydantic v1
FastAPI 0.126.0 a supprimé la prise en charge de Pydantic v1, tout en continuant à prendre en charge `pydantic.v1` pendant un certain temps. FastAPI 0.126.0 a supprimé la prise en charge de Pydantic v1, tout en continuant à prendre en charge `pydantic.v1` pendant un certain temps.
FastAPI 0.128.0 a également supprimé la prise en charge de `pydantic.v1`, donc les derniÚres versions de FastAPI nécessitent Pydantic v2.
/// warning | Alertes /// warning | Alertes
L'Ă©quipe Pydantic a arrĂȘtĂ© la prise en charge de Pydantic v1 pour les derniĂšres versions de Python, Ă  partir de **Python 3.14**. L'Ă©quipe Pydantic a arrĂȘtĂ© la prise en charge de Pydantic v1 pour les derniĂšres versions de Python, Ă  partir de **Python 3.14**.
@ -54,6 +56,16 @@ Cela signifie que vous pouvez installer la derniĂšre version de Pydantic v2 et i
### Prise en charge de FastAPI pour Pydantic v1 dans v2 { #fastapi-support-for-pydantic-v1-in-v2 } ### Prise en charge de FastAPI pour Pydantic v1 dans v2 { #fastapi-support-for-pydantic-v1-in-v2 }
/// warning | Alertes
Cette prise en charge FastAPI des modĂšles `pydantic.v1` a Ă©tĂ© ajoutĂ©e dans **FastAPI 0.119.0** et supprimĂ©e dans **FastAPI 0.128.0**. Elle Ă©tait destinĂ©e Ă  ĂȘtre une aide temporaire pour la migration vers Pydantic v2.
Dans les versions actuelles de FastAPI, l'utilisation d'un modĂšle `pydantic.v1` dans votre application lĂšvera une erreur.
Le reste de cette section décrit la prise en charge temporaire disponible uniquement dans ces anciennes versions.
///
Depuis FastAPI 0.119.0, il existe également une prise en charge partielle de Pydantic v1 depuis l'intérieur de Pydantic v2, pour faciliter la migration vers v2. Depuis FastAPI 0.119.0, il existe également une prise en charge partielle de Pydantic v1 depuis l'intérieur de Pydantic v2, pour faciliter la migration vers v2.
Vous pouvez donc mettre Ă  niveau Pydantic vers la derniĂšre version 2 et modifier les imports pour utiliser le sous-module `pydantic.v1`, et dans de nombreux cas cela fonctionnera tel quel. Vous pouvez donc mettre Ă  niveau Pydantic vers la derniĂšre version 2 et modifier les imports pour utiliser le sous-module `pydantic.v1`, et dans de nombreux cas cela fonctionnera tel quel.
@ -122,6 +134,12 @@ Si vous devez utiliser certains des outils spécifiques à FastAPI pour les para
### Migrer par étapes { #migrate-in-steps } ### Migrer par étapes { #migrate-in-steps }
/// warning | Alertes
La migration progressive utilisant Ă  la fois des modĂšles Pydantic v1 et v2 dans la mĂȘme application dĂ©crite ci-dessous ne fonctionne que dans **FastAPI 0.119.0 Ă  0.127.x**. Elle a Ă©tĂ© supprimĂ©e dans **FastAPI 0.128.0**, les derniĂšres versions nĂ©cessitent des modĂšles **Pydantic v2**.
///
/// tip | Astuce /// tip | Astuce
Essayez d'abord avec `bump-pydantic` ; si vos tests passent et que cela fonctionne, vous avez tout terminĂ© en une seule commande. ✹ Essayez d'abord avec `bump-pydantic` ; si vos tests passent et que cela fonctionne, vous avez tout terminĂ© en une seule commande. ✹

10
docs/fr/docs/how-to/separate-openapi-schemas.md

@ -34,7 +34,7 @@ Mais si vous utilisez le mĂȘme modĂšle en sortie, comme ici :
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *} {* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *}
... alors, comme `description` a une valeur par dĂ©faut, si vous ne retournez rien pour ce champ, il aura tout de mĂȘme cette **valeur par dĂ©faut**. ... alors, comme `description` a une valeur par dĂ©faut, si vous **ne retournez rien** pour ce champ, il aura tout de mĂȘme cette **valeur par dĂ©faut**.
### ModÚle pour les données de réponse en sortie { #model-for-output-response-data } ### ModÚle pour les données de réponse en sortie { #model-for-output-response-data }
@ -52,8 +52,8 @@ La maniÚre de décrire cela dans OpenAPI est de marquer ce champ comme **requis
Pour cette raison, le schĂ©ma JSON d'un modĂšle peut ĂȘtre diffĂ©rent selon qu'il est utilisĂ© pour **l'entrĂ©e ou la sortie** : Pour cette raison, le schĂ©ma JSON d'un modĂšle peut ĂȘtre diffĂ©rent selon qu'il est utilisĂ© pour **l'entrĂ©e ou la sortie** :
- pour **l'entrée**, `description` ne sera **pas requis** * pour **l'entrée**, `description` ne sera **pas requis**
- pour **la sortie**, il sera **requis** (et éventuellement `None`, ou en termes JSON, `null`) * pour **la sortie**, il sera **requis** (et éventuellement `None`, ou en termes JSON, `null`)
### ModĂšle de sortie dans les documents { #model-for-output-in-docs } ### ModĂšle de sortie dans les documents { #model-for-output-in-docs }
@ -79,7 +79,7 @@ Avec cette fonctionnalité de **Pydantic v2**, la documentation de votre API est
## Ne pas séparer les schémas { #do-not-separate-schemas } ## Ne pas séparer les schémas { #do-not-separate-schemas }
Il existe des cas oĂč vous pourriez vouloir avoir le **mĂȘme schĂ©ma pour l'entrĂ©e et la sortie**. Maintenant, il existe des cas oĂč vous pourriez vouloir avoir le **mĂȘme schĂ©ma pour l'entrĂ©e et la sortie**.
Le cas d'usage principal est probablement que vous avez dĂ©jĂ  du code client/SDKs gĂ©nĂ©rĂ©s automatiquement et que vous ne souhaitez pas encore mettre Ă  jour tout ce code client/ces SDKs gĂ©nĂ©rĂ©s automatiquement ; vous le ferez sans doute Ă  un moment donnĂ©, mais peut‑ĂȘtre pas tout de suite. Le cas d'usage principal est probablement que vous avez dĂ©jĂ  du code client/SDKs gĂ©nĂ©rĂ©s automatiquement et que vous ne souhaitez pas encore mettre Ă  jour tout ce code client/ces SDKs gĂ©nĂ©rĂ©s automatiquement ; vous le ferez sans doute Ă  un moment donnĂ©, mais peut‑ĂȘtre pas tout de suite.
@ -95,7 +95,7 @@ La prise en charge de `separate_input_output_schemas` a été ajoutée dans Fast
### Utiliser le mĂȘme schĂ©ma pour les modĂšles d'entrĂ©e et de sortie dans les documents { #same-schema-for-input-and-output-models-in-docs } ### Utiliser le mĂȘme schĂ©ma pour les modĂšles d'entrĂ©e et de sortie dans les documents { #same-schema-for-input-and-output-models-in-docs }
Désormais, il n'y aura qu'un seul schéma pour l'entrée et la sortie du modÚle, uniquement `Item`, et `description` ne sera pas requis : Désormais, il n'y aura qu'un seul schéma pour l'entrée et la sortie du modÚle, uniquement `Item`, et `description` sera **non requis** :
<div class="screenshot"> <div class="screenshot">
<img src="/img/tutorial/separate-openapi-schemas/image05.png"> <img src="/img/tutorial/separate-openapi-schemas/image05.png">

6
docs/fr/docs/index.md

@ -45,7 +45,7 @@ Les principales fonctionnalités sont :
* **Rapide** : trĂšs hautes performances, au niveau de **NodeJS** et **Go** (grĂące Ă  Starlette et Pydantic). [L'un des frameworks Python les plus rapides](#performance). * **Rapide** : trĂšs hautes performances, au niveau de **NodeJS** et **Go** (grĂące Ă  Starlette et Pydantic). [L'un des frameworks Python les plus rapides](#performance).
* **Rapide à coder** : augmente la vitesse de développement des fonctionnalités d'environ 200 % à 300 %. * * **Rapide à coder** : augmente la vitesse de développement des fonctionnalités d'environ 200 % à 300 %. *
* **Moins de bugs** : réduit d'environ 40 % les erreurs induites par le développeur. * * **Moins de bugs** : réduit d'environ 40 % les erreurs induites par le développeur. *
* **Intuitif** : excellente compatibilité avec les éditeurs. <dfn title="également connu sous le nom de : auto-complétion, autocomplétion, IntelliSense">Autocomplétion</dfn> partout. Moins de temps passé à déboguer. * **Intuitif** : excellente compatibilité avec les éditeurs. <dfn title="également connu sous le nom de : autocomplétion, autocomplétion, IntelliSense">Autocomplétion</dfn> partout. Moins de temps passé à déboguer.
* **Facile** : conçu pour ĂȘtre facile Ă  utiliser et Ă  apprendre. Moins de temps passĂ© Ă  lire les documents. * **Facile** : conçu pour ĂȘtre facile Ă  utiliser et Ă  apprendre. Moins de temps passĂ© Ă  lire les documents.
* **Concis** : diminue la duplication de code. Plusieurs fonctionnalités à partir de chaque déclaration de paramÚtre. Moins de bugs. * **Concis** : diminue la duplication de code. Plusieurs fonctionnalités à partir de chaque déclaration de paramÚtre. Moins de bugs.
* **Robuste** : obtenez un code prĂȘt pour la production. Avec une documentation interactive automatique. * **Robuste** : obtenez un code prĂȘt pour la production. Avec une documentation interactive automatique.
@ -192,7 +192,7 @@ $ pip install "fastapi[standard]"
</div> </div>
**Remarque** : Vous devez vous assurer de mettre « fastapi[standard] » entre guillemets pour garantir que cela fonctionne dans tous les terminaux. **Remarque** : Vous devez vous assurer de mettre `"fastapi[standard]"` entre guillemets pour garantir que cela fonctionne dans tous les terminaux.
## Exemple { #example } ## Exemple { #example }
@ -239,7 +239,7 @@ async def read_item(item_id: int, q: str | None = None):
**Remarque** : **Remarque** :
Si vous ne savez pas, consultez la section « Vous ĂȘtes pressĂ©s ? » Ă  propos de [`async` et `await` dans la documentation](https://fastapi.tiangolo.com/fr/async/#in-a-hurry). Si vous ne savez pas, consultez la section « Vous ĂȘtes pressĂ©s ? » Ă  propos de [`async` et `await` dans les documents](https://fastapi.tiangolo.com/fr/async/#in-a-hurry).
</details> </details>

1
docs/fr/docs/project-generation.md

@ -1,5 +1,6 @@
# ModĂšle Full Stack FastAPI { #full-stack-fastapi-template } # ModĂšle Full Stack FastAPI { #full-stack-fastapi-template }
Les modĂšles, bien qu'ils soient gĂ©nĂ©ralement livrĂ©s avec une configuration spĂ©cifique, sont conçus pour ĂȘtre flexibles et personnalisables. Cela vous permet de les modifier et de les adapter aux exigences de votre projet, ce qui en fait un excellent point de dĂ©part. 🏁 Les modĂšles, bien qu'ils soient gĂ©nĂ©ralement livrĂ©s avec une configuration spĂ©cifique, sont conçus pour ĂȘtre flexibles et personnalisables. Cela vous permet de les modifier et de les adapter aux exigences de votre projet, ce qui en fait un excellent point de dĂ©part. 🏁
Vous pouvez utiliser ce modĂšle pour dĂ©marrer, car il inclut une grande partie de la configuration initiale, la sĂ©curitĂ©, la base de donnĂ©es et quelques endpoints d'API dĂ©jĂ  prĂȘts pour vous. Vous pouvez utiliser ce modĂšle pour dĂ©marrer, car il inclut une grande partie de la configuration initiale, la sĂ©curitĂ©, la base de donnĂ©es et quelques endpoints d'API dĂ©jĂ  prĂȘts pour vous.

8
docs/fr/docs/python-types.md

@ -44,7 +44,7 @@ C'est un programme trĂšs simple.
Mais maintenant imaginez que vous l'écriviez de zéro. Mais maintenant imaginez que vous l'écriviez de zéro.
À un certain moment, vous auriez commencĂ© la dĂ©finition de la fonction, vous aviez les paramĂštres prĂȘts ... À un moment donnĂ©, vous commencez Ă  dĂ©finir la fonction, et vous avez les paramĂštres prĂȘts ...
Mais ensuite vous devez appeler « cette méthode qui convertit la premiÚre lettre en majuscule ». Mais ensuite vous devez appeler « cette méthode qui convertit la premiÚre lettre en majuscule ».
@ -279,13 +279,13 @@ Ensuite, vous créez une instance de cette classe avec certaines valeurs et elle
Et vous obtenez tout le support de l'éditeur avec cet objet résultant. Et vous obtenez tout le support de l'éditeur avec cet objet résultant.
Un exemple tiré de la documentation officielle de Pydantic : Un exemple tiré des documents officiels de Pydantic :
{* ../../docs_src/python_types/tutorial011_py310.py *} {* ../../docs_src/python_types/tutorial011_py310.py *}
/// note | Remarque /// note | Remarque
Pour en savoir plus Ă  propos de [Pydantic, consultez sa documentation](https://docs.pydantic.dev/). Pour en savoir plus Ă  propos de [Pydantic, consultez ses documents](https://docs.pydantic.dev/).
/// ///
@ -305,7 +305,7 @@ Python lui-mĂȘme ne fait rien avec ce `Annotated`. Et pour les Ă©diteurs et autr
Mais vous pouvez utiliser cet espace dans `Annotated` pour fournir à **FastAPI** des métadonnées supplémentaires sur la façon dont vous voulez que votre application se comporte. Mais vous pouvez utiliser cet espace dans `Annotated` pour fournir à **FastAPI** des métadonnées supplémentaires sur la façon dont vous voulez que votre application se comporte.
L'important à retenir est que **le premier « paramÚtre de type »** que vous passez à `Annotated` est le **type réel**. Le reste n'est que des métadonnées pour d'autres outils. L'important à retenir est que **le premier *paramÚtre de type*** que vous passez à `Annotated` est le **type réel**. Le reste n'est que des métadonnées pour d'autres outils.
Pour l'instant, vous avez juste besoin de savoir que `Annotated` existe, et que c'est du Python standard. 😎 Pour l'instant, vous avez juste besoin de savoir que `Annotated` existe, et que c'est du Python standard. 😎

30
docs/fr/docs/tutorial/bigger-applications.md

@ -17,16 +17,16 @@ Supposons que vous ayez une structure de fichiers comme ceci :
``` ```
. .
├── app ├── app
│   ├── __init__.py │ ├── __init__.py
│   ├── main.py │ ├── main.py
│   ├── dependencies.py │ ├── dependencies.py
│   └── routers │ └── routers
│   │ ├── __init__.py │ │ ├── __init__.py
│   │ ├── items.py │ │ ├── items.py
│   │ └── users.py │ │ └── users.py
│   └── internal │ └── internal
│   ├── __init__.py │ ├── __init__.py
│   └── admin.py │ └── admin.py
``` ```
/// tip | Astuce /// tip | Astuce
@ -283,7 +283,7 @@ Mais nous pouvons toujours ajouter _davantage_ de `tags` qui seront appliqués
/// tip | Astuce /// tip | Astuce
Ce dernier *chemin d'accĂšs* aura la combinaison de tags : `["items", "custom"]`. Ce dernier chemin d'accĂšs aura la combinaison de tags : `["items", "custom"]`.
Et il aura également les deux réponses dans la documentation, une pour `404` et une pour `403`. Et il aura également les deux réponses dans la documentation, une pour `404` et une pour `403`.
@ -453,7 +453,7 @@ et cela fonctionnera correctement, avec tous les autres *chemins d'accĂšs* ajout
/// note | Détails trÚs techniques /// note | Détails trÚs techniques
Note : c'est un détail trÚs technique que vous pouvez probablement **simplement ignorer**. **Remarque** : c'est un détail trÚs technique que vous pouvez probablement **simplement ignorer**.
--- ---
@ -490,13 +490,13 @@ Vous pourriez aussi passer le chemin Ă  la commande, comme :
$ fastapi dev app/main.py $ fastapi dev app/main.py
``` ```
Mais vous devriez vous rappeler de passer le bon chemin Ă  chaque fois que vous appelez la commande `fastapi`. Mais vous devez vous rappeler de passer le bon chemin Ă  chaque fois que vous appelez la commande `fastapi`.
En outre, d'autres outils pourraient ne pas ĂȘtre en mesure de la trouver, par exemple l'[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandĂ© d'utiliser l'`entrypoint` dans `pyproject.toml`. En outre, d'autres outils pourraient ne pas ĂȘtre en mesure de la trouver, par exemple l'[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandĂ© d'utiliser l'`entrypoint` dans `pyproject.toml`.
/// ///
## Consulter la documentation API automatique { #check-the-automatic-api-docs } ## Consulter les documents d'API automatiques { #check-the-automatic-api-docs }
Maintenant, exécutez votre application : Maintenant, exécutez votre application :
@ -512,7 +512,7 @@ $ fastapi dev
Et ouvrez les documents Ă  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Et ouvrez les documents Ă  [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Vous verrez la documentation API automatique, incluant les chemins de tous les sous-modules, utilisant les bons chemins (et préfixes) et les bons tags : Vous verrez les documents d'API automatiques, incluant les chemins de tous les sous-modules, utilisant les bons chemins (et préfixes) et les bons tags :
<img src="/img/tutorial/bigger-applications/image01.png"> <img src="/img/tutorial/bigger-applications/image01.png">

8
docs/fr/docs/tutorial/body-nested-models.md

@ -1,6 +1,6 @@
# Corps - ModÚles imbriqués { #body-nested-models } # Corps - ModÚles imbriqués { #body-nested-models }
Avec FastAPI, vous pouvez définir, valider, documenter et utiliser des modÚles imbriqués à n'importe quelle profondeur (grùce à Pydantic). Avec **FastAPI**, vous pouvez définir, valider, documenter et utiliser des modÚles imbriqués à n'importe quelle profondeur (grùce à Pydantic).
## Déclarer des champs de liste { #list-fields } ## Déclarer des champs de liste { #list-fields }
@ -69,7 +69,7 @@ Nous pouvons ensuite l'utiliser comme type d'un attribut :
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *} {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
Cela signifie que FastAPI attendrait un corps similaire Ă  : Cela signifie que **FastAPI** attendrait un corps similaire Ă  :
```JSON ```JSON
{ {
@ -85,7 +85,7 @@ Cela signifie que FastAPI attendrait un corps similaire Ă  :
} }
``` ```
Là encore, avec cette simple déclaration, avec FastAPI vous obtenez : Là encore, avec cette simple déclaration, avec **FastAPI** vous obtenez :
- Prise en charge par l'Ă©diteur (autocomplĂ©tion, etc.), mĂȘme pour les modĂšles imbriquĂ©s - Prise en charge par l'Ă©diteur (autocomplĂ©tion, etc.), mĂȘme pour les modĂšles imbriquĂ©s
- Conversion des données - Conversion des données
@ -209,7 +209,7 @@ Et le `dict` que vous recevez dans `weights` aura en réalité des clés `int` e
## Récapitulatif { #recap } ## Récapitulatif { #recap }
Avec FastAPI, vous bénéficiez de la flexibilité maximale fournie par les modÚles Pydantic, tout en gardant votre code simple, concis et élégant. Avec **FastAPI**, vous bénéficiez de la flexibilité maximale fournie par les modÚles Pydantic, tout en gardant votre code simple, concis et élégant.
Mais avec tous les avantages : Mais avec tous les avantages :

26
docs/fr/docs/tutorial/body.md

@ -1,18 +1,18 @@
# Corps de la requĂȘte { #request-body } # Corps de la requĂȘte { #request-body }
Quand vous avez besoin d'envoyer de la donnĂ©e depuis un client (comme un navigateur) vers votre API, vous l'envoyez en tant que **corps de requĂȘte**. Quand vous avez besoin d'envoyer de la donnĂ©e depuis un client (comme un navigateur) vers votre API, vous l'envoyez en tant que **corps de la requĂȘte**.
Le corps d'une **requĂȘte** est de la donnĂ©e envoyĂ©e par le client Ă  votre API. Le corps d'une **rĂ©ponse** est la donnĂ©e envoyĂ©e par votre API au client. Le corps d'une **requĂȘte** est de la donnĂ©e envoyĂ©e par le client Ă  votre API. Le corps d'une **rĂ©ponse** est la donnĂ©e envoyĂ©e par votre API au client.
Votre API aura presque toujours Ă  envoyer un corps de **rĂ©ponse**. Mais un client n'a pas toujours Ă  envoyer un **corps de requĂȘte** : parfois il demande seulement un chemin, peut-ĂȘtre avec quelques paramĂštres de requĂȘte, mais n'envoie pas de corps. Votre API aura presque toujours Ă  envoyer un corps de **rĂ©ponse**. Mais un client n'a pas toujours Ă  envoyer un **corps de la requĂȘte** : parfois il demande seulement un chemin, peut-ĂȘtre avec quelques paramĂštres de requĂȘte, mais n'envoie pas de corps.
Pour dĂ©clarer un corps de **requĂȘte**, on utilise les modĂšles de [Pydantic](https://docs.pydantic.dev/) en profitant de tous leurs avantages et fonctionnalitĂ©s. Pour dĂ©clarer un corps de **requĂȘte**, on utilise les modĂšles de [Pydantic](https://docs.pydantic.dev/) en profitant de tous leurs avantages et fonctionnalitĂ©s.
/// note | Remarque /// note | Remarque
Pour envoyer de la donnée, vous devez utiliser : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`. Pour envoyer de la donnée, vous devez utiliser l'une de ces méthodes : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`.
Envoyer un corps dans une requĂȘte `GET` a un comportement non dĂ©fini dans les spĂ©cifications, cela est nĂ©anmoins supportĂ© par **FastAPI**, seulement pour des cas d'utilisation trĂšs complexes/extrĂȘmes. Envoyer un corps dans une requĂȘte `GET` a un comportement non dĂ©fini dans les spĂ©cifications, cela est nĂ©anmoins supportĂ© par FastAPI, seulement pour des cas d'utilisation trĂšs complexes/extrĂȘmes.
Ceci Ă©tant dĂ©couragĂ©, la documentation interactive gĂ©nĂ©rĂ©e par Swagger UI ne montrera pas de documentation pour le corps d'une requĂȘte `GET`, et les proxys intermĂ©diaires risquent de ne pas le supporter. Ceci Ă©tant dĂ©couragĂ©, la documentation interactive gĂ©nĂ©rĂ©e par Swagger UI ne montrera pas de documentation pour le corps d'une requĂȘte `GET`, et les proxys intermĂ©diaires risquent de ne pas le supporter.
@ -32,6 +32,7 @@ Utilisez les types Python standard pour tous les attributs :
{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *} {* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
Tout comme pour la dĂ©claration de paramĂštres de requĂȘte, quand un attribut de modĂšle a une valeur par dĂ©faut, il n'est pas nĂ©cessaire. Sinon, il est requis. Utilisez `None` pour le rendre simplement optionnel. Tout comme pour la dĂ©claration de paramĂštres de requĂȘte, quand un attribut de modĂšle a une valeur par dĂ©faut, il n'est pas nĂ©cessaire. Sinon, il est requis. Utilisez `None` pour le rendre simplement optionnel.
Par exemple, le modÚle ci-dessus déclare un JSON « `object` » (ou `dict` Python) tel que : Par exemple, le modÚle ci-dessus déclare un JSON « `object` » (ou `dict` Python) tel que :
@ -73,7 +74,7 @@ En utilisant uniquement les déclarations de type Python, **FastAPI** réussit
* Passer la donnée reçue dans le paramÚtre `item`. * Passer la donnée reçue dans le paramÚtre `item`.
* Ce paramÚtre ayant été déclaré dans la fonction comme étant de type `Item`, vous aurez aussi tout le support offert par l'éditeur (autocomplétion, etc.) pour tous les attributs de ce paramÚtre et les types de ces attributs. * Ce paramÚtre ayant été déclaré dans la fonction comme étant de type `Item`, vous aurez aussi tout le support offert par l'éditeur (autocomplétion, etc.) pour tous les attributs de ce paramÚtre et les types de ces attributs.
* Générer des définitions [JSON Schema](https://json-schema.org) pour votre modÚle ; vous pouvez également les utiliser partout ailleurs si cela a du sens pour votre projet. * Générer des définitions [JSON Schema](https://json-schema.org) pour votre modÚle ; vous pouvez également les utiliser partout ailleurs si cela a du sens pour votre projet.
* Ces schémas participeront à la constitution du schéma généré OpenAPI, et seront utilisés par les documentations automatiques <abbr title="User Interfaces - Interfaces utilisateur">UIs</abbr>. * Ces schémas feront partie du schéma OpenAPI généré, et seront utilisés par les <abbr title="User Interfaces - Interfaces utilisateur">UIs</abbr> de la documentation automatique.
## Documentation automatique { #automatic-docs } ## Documentation automatique { #automatic-docs }
@ -97,11 +98,11 @@ Et vous obtenez aussi des vérifications d'erreurs pour les opérations de types
Ce n'est pas un hasard, ce framework entier a été bùti avec ce design comme objectif. Ce n'est pas un hasard, ce framework entier a été bùti avec ce design comme objectif.
Et cela a été rigoureusement testé durant la phase de design, avant toute implémentation, pour vous assurer que cela fonctionnerait avec tous les éditeurs. Et cela a été rigoureusement testé durant la phase de design, avant toute implémentation, pour s'assurer que cela fonctionnerait avec tous les éditeurs.
Des changements sur Pydantic ont mĂȘme Ă©tĂ© faits pour supporter cela. Des changements sur Pydantic ont mĂȘme Ă©tĂ© faits pour supporter cela.
Les captures d'écran précédentes ont été prises sur [Visual Studio Code](https://code.visualstudio.com). Les captures d'écran précédentes ont été prises avec [Visual Studio Code](https://code.visualstudio.com).
Mais vous auriez le mĂȘme support de l'Ă©diteur avec [PyCharm](https://www.jetbrains.com/pycharm/) et la majoritĂ© des autres Ă©diteurs de code Python : Mais vous auriez le mĂȘme support de l'Ă©diteur avec [PyCharm](https://www.jetbrains.com/pycharm/) et la majoritĂ© des autres Ă©diteurs de code Python :
@ -129,15 +130,16 @@ Dans la fonction, vous pouvez accéder à tous les attributs de l'objet du modÚ
## Corps de la requĂȘte + paramĂštres de chemin { #request-body-path-parameters } ## Corps de la requĂȘte + paramĂštres de chemin { #request-body-path-parameters }
Vous pouvez dĂ©clarer des paramĂštres de chemin et un corps de requĂȘte pour la mĂȘme *chemin d'accĂšs*. Vous pouvez dĂ©clarer des paramĂštres de chemin et le corps de la requĂȘte en mĂȘme temps.
**FastAPI** est capable de reconnaĂźtre que les paramĂštres de la fonction qui correspondent aux paramĂštres de chemin doivent ĂȘtre **rĂ©cupĂ©rĂ©s depuis le chemin**, et que les paramĂštres de fonctions dĂ©clarĂ©s comme modĂšles Pydantic devraient ĂȘtre **rĂ©cupĂ©rĂ©s depuis le corps de la requĂȘte**. **FastAPI** est capable de reconnaĂźtre que les paramĂštres de la fonction qui correspondent aux paramĂštres de chemin doivent ĂȘtre **rĂ©cupĂ©rĂ©s depuis le chemin**, et que les paramĂštres de la fonction dĂ©clarĂ©s comme modĂšles Pydantic devraient ĂȘtre **rĂ©cupĂ©rĂ©s depuis le corps de la requĂȘte**.
{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *} {* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
## Corps de la requĂȘte + paramĂštres de chemin et de requĂȘte { #request-body-path-query-parameters } ## Corps de la requĂȘte + paramĂštres de chemin et de requĂȘte { #request-body-path-query-parameters }
Vous pouvez aussi dĂ©clarer un **corps**, et des paramĂštres de **chemin** et de **requĂȘte** dans la mĂȘme *chemin d'accĂšs*. Vous pouvez aussi dĂ©clarer un **corps**, et des paramĂštres de **chemin** et de **requĂȘte**, tous en mĂȘme temps.
**FastAPI** saura reconnaßtre chacun d'entre eux et récupérer la bonne donnée au bon endroit. **FastAPI** saura reconnaßtre chacun d'entre eux et récupérer la bonne donnée au bon endroit.
@ -151,9 +153,9 @@ Les paramĂštres de la fonction seront reconnus comme tel :
/// note | Remarque /// note | Remarque
**FastAPI** saura que la valeur de `q` n'est pas requise grùce à la valeur par défaut `= None`. FastAPI saura que la valeur de `q` n'est pas requise grùce à la valeur par défaut `= None`.
L'annotation de type `str | None` n'est pas utilisée par **FastAPI** pour déterminer que la valeur n'est pas requise, il le saura parce qu'elle a une valeur par défaut `= None`. L'annotation de type `str | None` n'est pas utilisée par FastAPI pour déterminer que la valeur n'est pas requise, il le saura parce qu'elle a une valeur par défaut `= None`.
Mais ajouter ces annotations de type permettra à votre éditeur de vous offrir un meilleur support et de détecter des erreurs. Mais ajouter ces annotations de type permettra à votre éditeur de vous offrir un meilleur support et de détecter des erreurs.

20
docs/fr/docs/tutorial/debugging.md

@ -74,7 +74,7 @@ ne sera pas exécutée.
/// note | Remarque /// note | Remarque
Pour plus d'informations, consultez [la documentation officielle de Python](https://docs.python.org/3/library/__main__.html). Pour plus d'informations, consultez [les documents officiels de Python](https://docs.python.org/3/library/__main__.html).
/// ///
@ -86,10 +86,10 @@ Parce que vous exécutez le serveur Uvicorn directement depuis votre code, vous
Par exemple, dans Visual Studio Code, vous pouvez : Par exemple, dans Visual Studio Code, vous pouvez :
- Allez dans le panneau « Debug ». * Allez dans le panneau « Debug ».
- « Add configuration ... ». * « Add configuration... ».
- Sélectionnez « Python ». * Sélectionnez « Python ».
- Lancez le <abbr title="En anglais: debugger">débogueur</abbr> avec l'option « Python: Current File (Integrated Terminal) ». * Lancez le <abbr title="En anglais: debugger">débogueur</abbr> avec l'option « `Python: Current File (Integrated Terminal)` ».
Il dĂ©marrera alors le serveur avec votre code **FastAPI**, s'arrĂȘtera Ă  vos points d'arrĂȘt, etc. Il dĂ©marrera alors le serveur avec votre code **FastAPI**, s'arrĂȘtera Ă  vos points d'arrĂȘt, etc.
@ -99,12 +99,12 @@ Voici Ă  quoi cela pourrait ressembler :
--- ---
Si vous utilisez Pycharm, vous pouvez : Si vous utilisez PyCharm, vous pouvez :
- Ouvrez le menu « Run ». * Ouvrez le menu « Run ».
- Sélectionnez l'option « Debug ... ». * Sélectionnez l'option « Debug... ».
- Un menu contextuel s'affiche alors. * Un menu contextuel s'affiche alors.
- Sélectionnez le fichier à déboguer (dans ce cas, `main.py`). * Sélectionnez le fichier à déboguer (dans ce cas, `main.py`).
Il dĂ©marrera alors le serveur avec votre code **FastAPI**, s'arrĂȘtera Ă  vos points d'arrĂȘt, etc. Il dĂ©marrera alors le serveur avec votre code **FastAPI**, s'arrĂȘtera Ă  vos points d'arrĂȘt, etc.

13
docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md

@ -1,6 +1,6 @@
# Utiliser des dépendances avec `yield` { #dependencies-with-yield } # Utiliser des dépendances avec `yield` { #dependencies-with-yield }
FastAPI prend en charge des dépendances qui effectuent des <dfn title='parfois aussi appelées « exit code », « cleanup code », « teardown code », « closing code », « context manager exit code », etc.'>étapes supplémentaires aprÚs l'exécution</dfn>. FastAPI prend en charge des dépendances qui effectuent des <dfn title='parfois également appelées « code de sortie », « code de nettoyage », « code de démontage », « code de fermeture », « code de sortie de gestionnaire de contexte », etc.'>étapes supplémentaires aprÚs l'exécution</dfn>.
Pour cela, utilisez `yield` au lieu de `return`, et écrivez les étapes supplémentaires (code) aprÚs. Pour cela, utilisez `yield` au lieu de `return`, et écrivez les étapes supplémentaires (code) aprÚs.
@ -194,16 +194,16 @@ Mais si vous savez que vous n'aurez pas besoin d'utiliser la dépendance aprÚs
`Depends()` reçoit un paramĂštre `scope` qui peut ĂȘtre : `Depends()` reçoit un paramĂštre `scope` qui peut ĂȘtre :
* « function » : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte, terminer la dĂ©pendance aprĂšs la fin de la *fonction de chemin d'accĂšs*, mais **avant** que la rĂ©ponse ne soit renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** de la *fonction de chemin d'accĂšs*. * `"function"` : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte, terminer la dĂ©pendance aprĂšs la fin de la *fonction de chemin d'accĂšs*, mais **avant** que la rĂ©ponse ne soit renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** de la *fonction de chemin d'accĂšs*.
* « request » : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte (similaire Ă  l'utilisation de « function »), mais terminer **aprĂšs** que la rĂ©ponse a Ă©tĂ© renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** du cycle **requĂȘte** et rĂ©ponse. * `"request"` : dĂ©marrer la dĂ©pendance avant la *fonction de chemin d'accĂšs* qui gĂšre la requĂȘte (similaire Ă  l'utilisation de `"function"`), mais terminer **aprĂšs** que la rĂ©ponse a Ă©tĂ© renvoyĂ©e au client. Ainsi, la fonction de dĂ©pendance sera exĂ©cutĂ©e **autour** du cycle **requĂȘte** et rĂ©ponse.
S'il n'est pas spécifié et que la dépendance utilise `yield`, le `scope` sera par défaut « request ». S'il n'est pas spécifié et que la dépendance utilise `yield`, le `scope` sera par défaut `"request"`.
### Définir `scope` pour les sous-dépendances { #scope-for-sub-dependencies } ### Définir `scope` pour les sous-dépendances { #scope-for-sub-dependencies }
Lorsque vous déclarez une dépendance avec un `scope="request"` (par défaut), toute sous-dépendance doit également avoir un `scope` de « request ». Lorsque vous déclarez une dépendance avec un `scope="request"` (par défaut), toute sous-dépendance doit également avoir un `scope` de `"request"`.
Mais une dépendance avec un `scope` de « function » peut avoir des dépendances avec un `scope` de « function » et un `scope` de « request ». Mais une dépendance avec un `scope` de `"function"` peut avoir des dépendances avec un `scope` de `"function"` et un `scope` de `"request"`.
Cela vient du fait que toute dépendance doit pouvoir exécuter son code de sortie avant ses sous-dépendances, car elle pourrait encore avoir besoin de les utiliser pendant son code de sortie. Cela vient du fait que toute dépendance doit pouvoir exécuter son code de sortie avant ses sous-dépendances, car elle pourrait encore avoir besoin de les utiliser pendant son code de sortie.
@ -234,6 +234,7 @@ participant operation as Path Operation
Les dépendances avec `yield` ont évolué au fil du temps pour couvrir différents cas d'utilisation et corriger certains problÚmes. Les dépendances avec `yield` ont évolué au fil du temps pour couvrir différents cas d'utilisation et corriger certains problÚmes.
Si vous souhaitez voir ce qui a changé dans différentes versions de FastAPI, vous pouvez en savoir plus dans le guide avancé, dans [Dépendances avancées - Dépendances avec `yield`, `HTTPException`, `except` et Background Tasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). Si vous souhaitez voir ce qui a changé dans différentes versions de FastAPI, vous pouvez en savoir plus dans le guide avancé, dans [Dépendances avancées - Dépendances avec `yield`, `HTTPException`, `except` et Background Tasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks).
## Gestionnaires de contexte { #context-managers } ## Gestionnaires de contexte { #context-managers }
### Que sont les « Context Managers » { #what-are-context-managers } ### Que sont les « Context Managers » { #what-are-context-managers }

2
docs/fr/docs/tutorial/extra-data-types.md

@ -36,7 +36,7 @@ Voici quelques types de données supplémentaires que vous pouvez utiliser :
* `datetime.timedelta` : * `datetime.timedelta` :
* Un `datetime.timedelta` Python. * Un `datetime.timedelta` Python.
* Dans les requĂȘtes et les rĂ©ponses, il sera reprĂ©sentĂ© sous forme de `float` de secondes totales. * Dans les requĂȘtes et les rĂ©ponses, il sera reprĂ©sentĂ© sous forme de `float` de secondes totales.
* Pydantic permet aussi de le représenter sous la forme d'un « encodage de différence de temps ISO 8601 », [voir la documentation pour plus d'informations](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * Pydantic permet aussi de le représenter sous la forme d'un « encodage de différence de temps ISO 8601 », [voir les documents pour plus d'informations](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
* `frozenset` : * `frozenset` :
* Dans les requĂȘtes et les rĂ©ponses, traitĂ© de la mĂȘme maniĂšre qu'un `set` : * Dans les requĂȘtes et les rĂ©ponses, traitĂ© de la mĂȘme maniĂšre qu'un `set` :
* Dans les requĂȘtes, une liste sera lue, les doublons Ă©liminĂ©s, puis convertie en `set`. * Dans les requĂȘtes, une liste sera lue, les doublons Ă©liminĂ©s, puis convertie en `set`.

46
docs/fr/docs/tutorial/extra-models.md

@ -4,9 +4,9 @@ En poursuivant l'exemple précédent, il est courant d'avoir plusieurs modÚles
C'est particuliĂšrement vrai pour les modĂšles d'utilisateur, car : C'est particuliĂšrement vrai pour les modĂšles d'utilisateur, car :
* Le modÚle d'entrée doit pouvoir contenir un mot de passe. * Le **modÚle d'entrée** doit pouvoir contenir un mot de passe.
* Le modĂšle de sortie ne doit pas avoir de mot de passe. * Le **modĂšle de sortie** ne doit pas avoir de mot de passe.
* Le modÚle de base de données devra probablement avoir un mot de passe haché. * Le **modÚle de base de données** aurait probablement besoin d'avoir un mot de passe haché.
/// danger | Danger /// danger | Danger
@ -30,13 +30,13 @@ Voici une idée générale de l'apparence des modÚles avec leurs champs de mot
Les modÚles Pydantic ont une méthode `.model_dump()` qui renvoie un `dict` avec les données du modÚle. Les modÚles Pydantic ont une méthode `.model_dump()` qui renvoie un `dict` avec les données du modÚle.
Ainsi, si nous créons un objet Pydantic `user_in` comme : Ainsi, si nous créons un objet Pydantic `user_in` comme :
```Python ```Python
user_in = UserIn(username="john", password="secret", email="[email protected]") user_in = UserIn(username="john", password="secret", email="[email protected]")
``` ```
et que nous appelons ensuite : et que nous appelons ensuite :
```Python ```Python
user_dict = user_in.model_dump() user_dict = user_in.model_dump()
@ -44,13 +44,13 @@ user_dict = user_in.model_dump()
nous avons maintenant un `dict` avec les données dans la variable `user_dict` (c'est un `dict` au lieu d'un objet modÚle Pydantic). nous avons maintenant un `dict` avec les données dans la variable `user_dict` (c'est un `dict` au lieu d'un objet modÚle Pydantic).
Et si nous appelons : Et si nous appelons :
```Python ```Python
print(user_dict) print(user_dict)
``` ```
nous obtiendrions un `dict` Python contenant : nous obtiendrions un `dict` Python contenant :
```Python ```Python
{ {
@ -63,15 +63,15 @@ nous obtiendrions un `dict` Python contenant :
#### Déballer un `dict` { #unpacking-a-dict } #### Déballer un `dict` { #unpacking-a-dict }
Si nous prenons un `dict` comme `user_dict` et que nous le passons à une fonction (ou une classe) avec `**user_dict`, Python va « déballer » ce `dict`. Il passera les clés et valeurs de `user_dict` directement comme arguments nommés. Si nous prenons un `dict` comme `user_dict` et que nous le passons à une fonction (ou une classe) avec `**user_dict`, Python va « déballer » ce `dict`. Il passera les clés et valeurs de `user_dict` directement comme arguments clé-valeur.
Ainsi, en reprenant `user_dict` ci-dessus, écrire : Ainsi, en reprenant `user_dict` ci-dessus, écrire :
```Python ```Python
UserInDB(**user_dict) UserInDB(**user_dict)
``` ```
aurait pour résultat quelque chose d'équivalent à : aurait pour résultat quelque chose d'équivalent à :
```Python ```Python
UserInDB( UserInDB(
@ -82,7 +82,7 @@ UserInDB(
) )
``` ```
Ou plus exactement, en utilisant `user_dict` directement, quels que soient ses contenus futurs : Ou plus exactement, en utilisant `user_dict` directement, quels que soient ses contenus futurs :
```Python ```Python
UserInDB( UserInDB(
@ -95,14 +95,14 @@ UserInDB(
#### Créer un modÚle Pydantic à partir du contenu d'un autre { #a-pydantic-model-from-the-contents-of-another } #### Créer un modÚle Pydantic à partir du contenu d'un autre { #a-pydantic-model-from-the-contents-of-another }
Comme dans l'exemple ci-dessus nous avons obtenu `user_dict` depuis `user_in.model_dump()`, ce code : Comme dans l'exemple ci-dessus nous avons obtenu `user_dict` depuis `user_in.model_dump()`, ce code :
```Python ```Python
user_dict = user_in.model_dump() user_dict = user_in.model_dump()
UserInDB(**user_dict) UserInDB(**user_dict)
``` ```
serait équivalent à : serait équivalent à :
```Python ```Python
UserInDB(**user_in.model_dump()) UserInDB(**user_in.model_dump())
@ -114,13 +114,13 @@ Ainsi, nous obtenons un modÚle Pydantic à partir des données d'un autre modÚ
#### Déballer un `dict` et ajouter des mots-clés supplémentaires { #unpacking-a-dict-and-extra-keywords } #### Déballer un `dict` et ajouter des mots-clés supplémentaires { #unpacking-a-dict-and-extra-keywords }
Et en ajoutant ensuite l'argument nommé supplémentaire `hashed_password=hashed_password`, comme ici : Et en ajoutant ensuite l'argument nommé supplémentaire `hashed_password=hashed_password`, comme ici :
```Python ```Python
UserInDB(**user_in.model_dump(), hashed_password=hashed_password) UserInDB(**user_in.model_dump(), hashed_password=hashed_password)
``` ```
... revient à : ... revient à :
```Python ```Python
UserInDB( UserInDB(
@ -152,7 +152,7 @@ Nous pouvons déclarer un modÚle `UserBase` qui sert de base à nos autres mod
Toutes les conversions de données, validations, documentation, etc., fonctionneront comme d'habitude. Toutes les conversions de données, validations, documentation, etc., fonctionneront comme d'habitude.
De cette façon, nous pouvons ne déclarer que les différences entre les modÚles (avec `password` en clair, avec `hashed_password` et sans mot de passe) : De cette façon, nous pouvons ne déclarer que les différences entre les modÚles (avec `password` en clair, avec `hashed_password` et sans mot de passe) :
{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *} {* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *}
@ -162,7 +162,7 @@ Vous pouvez déclarer qu'une réponse est l'`Union` de deux types ou plus, ce qu
Cela sera défini dans OpenAPI avec `anyOf`. Cela sera défini dans OpenAPI avec `anyOf`.
Pour ce faire, utilisez l'annotation de type Python standard [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union) : Pour ce faire, utilisez l'annotation de type Python standard [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union) :
/// note | Remarque /// note | Remarque
@ -176,21 +176,21 @@ Lors de la définition d'une [`Union`](https://docs.pydantic.dev/latest/concepts
Dans cet exemple, nous passons `Union[PlaneItem, CarItem]` comme valeur de l'argument `response_model`. Dans cet exemple, nous passons `Union[PlaneItem, CarItem]` comme valeur de l'argument `response_model`.
Comme nous le passons comme valeur d'un argument au lieu de l'utiliser dans une annotation de type, nous devons utiliser `Union` mĂȘme en Python 3.10. Comme nous le passons comme **valeur Ă  un argument** au lieu de l'utiliser dans une **annotation de type**, nous devons utiliser `Union` mĂȘme en Python 3.10.
S'il s'agissait d'une annotation de type, nous pourrions utiliser la barre verticale, comme : S'il s'agissait d'une annotation de type, nous pourrions utiliser la barre verticale, comme :
```Python ```Python
some_variable: PlaneItem | CarItem some_variable: PlaneItem | CarItem
``` ```
Mais si nous écrivons cela dans l'affectation `response_model=PlaneItem | CarItem`, nous obtiendrons une erreur, car Python essaierait d'effectuer une « opération invalide » entre `PlaneItem` et `CarItem` au lieu de l'interpréter comme une annotation de type. Mais si nous écrivons cela dans l'affectation `response_model=PlaneItem | CarItem`, nous obtiendrons une erreur, car Python essaierait d'effectuer une **opération invalide** entre `PlaneItem` et `CarItem` au lieu de l'interpréter comme une annotation de type.
## Liste de modĂšles { #list-of-models } ## Liste de modĂšles { #list-of-models }
De la mĂȘme maniĂšre, vous pouvez dĂ©clarer des rĂ©ponses contenant des listes d'objets. De la mĂȘme maniĂšre, vous pouvez dĂ©clarer des rĂ©ponses contenant des listes d'objets.
Pour cela, utilisez le `list` Python standard : Pour cela, utilisez le `list` Python standard :
{* ../../docs_src/extra_models/tutorial004_py310.py hl[18] *} {* ../../docs_src/extra_models/tutorial004_py310.py hl[18] *}
@ -200,7 +200,7 @@ Vous pouvez également déclarer une réponse en utilisant un simple `dict` arbi
C'est utile si vous ne connaissez pas à l'avance les noms de champs/attributs valides (qui seraient nécessaires pour un modÚle Pydantic). C'est utile si vous ne connaissez pas à l'avance les noms de champs/attributs valides (qui seraient nécessaires pour un modÚle Pydantic).
Dans ce cas, vous pouvez utiliser `dict` : Dans ce cas, vous pouvez utiliser `dict` :
{* ../../docs_src/extra_models/tutorial005_py310.py hl[6] *} {* ../../docs_src/extra_models/tutorial005_py310.py hl[6] *}
@ -208,4 +208,4 @@ Dans ce cas, vous pouvez utiliser `dict` :
Utilisez plusieurs modÚles Pydantic et héritez librement selon chaque cas. Utilisez plusieurs modÚles Pydantic et héritez librement selon chaque cas.
Vous n'avez pas besoin d'avoir un seul modÚle de données par entité si cette entité doit pouvoir avoir différents « états ». Comme pour l'« entité » utilisateur, avec un état incluant `password`, `password_hash` et sans mot de passe. Vous n'avez pas besoin d'avoir un seul modÚle de données par entité si cette entité doit pouvoir avoir différents « états ». L'« entité » **utilisateur** est un exemple, avec des états qui incluent `password`, `password_hash`, ou aucun mot de passe.

32
docs/fr/docs/tutorial/first-steps.md

@ -145,20 +145,20 @@ Vous pourriez Ă©galement l’utiliser pour gĂ©nĂ©rer du code automatiquement, po
### Configurer le `entrypoint` de l’application dans `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } ### Configurer le `entrypoint` de l’application dans `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml }
Vous pouvez configurer l’emplacement de votre application dans un fichier `pyproject.toml` comme : Vous pouvez configurer l’emplacement de votre application dans un fichier `pyproject.toml` comme :
```toml ```toml
[tool.fastapi] [tool.fastapi]
entrypoint = "main:app" entrypoint = "main:app"
``` ```
Ce `entrypoint` indiquera à la commande `fastapi` qu’elle doit importer l’application comme : Ce `entrypoint` indiquera à la commande `fastapi` qu’elle doit importer l’application comme :
```python ```python
from main import app from main import app
``` ```
Si votre code est structurĂ© comme : Si votre code est structurĂ© comme :
``` ```
. .
@ -167,14 +167,14 @@ Si votre code est structurĂ© comme :
│   ├── __init__.py │   ├── __init__.py
``` ```
Alors vous dĂ©finiriez le `entrypoint` comme : Alors vous dĂ©finiriez le `entrypoint` comme :
```toml ```toml
[tool.fastapi] [tool.fastapi]
entrypoint = "backend.main:app" entrypoint = "backend.main:app"
``` ```
ce qui Ă©quivaudrait à : ce qui Ă©quivaudrait Ă  :
```python ```python
from backend.main import app from backend.main import app
@ -182,19 +182,19 @@ from backend.main import app
### `fastapi dev` avec un chemin ou avec l’option CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option } ### `fastapi dev` avec un chemin ou avec l’option CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
Vous pouvez Ă©galement passer le chemin du fichier Ă  la commande `fastapi dev`, et elle devinera l’objet d’application FastAPI Ă  utiliser : Vous pouvez Ă©galement passer le chemin du fichier Ă  la commande `fastapi dev`, et elle devinera l’objet d’application FastAPI Ă  utiliser :
```console ```console
$ fastapi dev main.py $ fastapi dev main.py
``` ```
Ou bien, vous pouvez aussi passer l’option `--entrypoint` à la commande `fastapi dev` : Ou bien, vous pouvez aussi passer l’option `--entrypoint` à la commande `fastapi dev` :
```console ```console
$ fastapi dev --entrypoint main:app $ fastapi dev --entrypoint main:app
``` ```
Mais vous devrez vous souvenir de passer le chemin\entrypoint correct à chaque exécution de la commande `fastapi`. Mais vous devez vous souvenir de passer le chemin\entrypoint correct à chaque exécution de la commande `fastapi`.
De plus, d’autres outils pourraient ne pas ĂȘtre capables de le trouver, par exemple l’[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandĂ© d’utiliser le `entrypoint` dans `pyproject.toml`. De plus, d’autres outils pourraient ne pas ĂȘtre capables de le trouver, par exemple l’[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandĂ© d’utiliser le `entrypoint` dans `pyproject.toml`.
@ -244,7 +244,7 @@ Ici, la variable `app` sera une « instance » de la classe `FastAPI`.
Ce sera le point principal d’interaction pour crĂ©er toute votre API. Ce sera le point principal d’interaction pour crĂ©er toute votre API.
### Étape 3 : crĂ©er un « chemin d’accĂšs » { #step-3-create-a-path-operation } ### Étape 3 : crĂ©er un *chemin d’accĂšs* { #step-3-create-a-path-operation }
#### Chemin { #path } #### Chemin { #path }
@ -305,11 +305,11 @@ Donc, dans OpenAPI, chacune des méthodes HTTP est appelée une « opération »
Nous allons donc aussi les appeler « opérations ». Nous allons donc aussi les appeler « opérations ».
#### DĂ©finir un « dĂ©corateur de chemin d’accĂšs » { #define-a-path-operation-decorator } #### DĂ©finir un *dĂ©corateur de chemin d’accĂšs* { #define-a-path-operation-decorator }
{* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *} {* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *}
Le `@app.get("/")` indique Ă  **FastAPI** que la fonction juste en dessous est chargĂ©e de gĂ©rer les requĂȘtes qui vont vers : Le `@app.get("/")` indique Ă  **FastAPI** que la fonction juste en dessous est chargĂ©e de gĂ©rer les requĂȘtes qui vont vers :
* le chemin `/` * le chemin `/`
* en utilisant une <dfn title="une méthode HTTP GET"><code>get</code> opération</dfn> * en utilisant une <dfn title="une méthode HTTP GET"><code>get</code> opération</dfn>
@ -318,13 +318,13 @@ Le `@app.get("/")` indique Ă  **FastAPI** que la fonction juste en dessous est c
Cette syntaxe `@something` en Python est appelée un « décorateur ». Cette syntaxe `@something` en Python est appelée un « décorateur ».
Vous la mettez au-dessus d’une fonction. Comme un joli chapeau dĂ©coratif (j’imagine que c’est de lĂ  que vient le terme đŸ€·đŸ»â€â™‚). Vous la mettez au-dessus d’une fonction. Comme un joli chapeau dĂ©coratif (j’imagine que c’est de lĂ  que vient le terme).
Un « décorateur » prend la fonction en dessous et fait quelque chose avec. Un « décorateur » prend la fonction en dessous et fait quelque chose avec.
Dans notre cas, ce décorateur indique à **FastAPI** que la fonction en dessous correspond au **chemin** `/` avec une **opération** `get`. Dans notre cas, ce décorateur indique à **FastAPI** que la fonction en dessous correspond au **chemin** `/` avec une **opération** `get`.
C’est le « dĂ©corateur de chemin d’accĂšs ». C’est le **« dĂ©corateur de chemin d’accĂšs »**.
/// ///
@ -355,7 +355,7 @@ Par exemple, lorsque vous utilisez GraphQL, vous effectuez normalement toutes le
### Étape 4 : dĂ©finir la **fonction de chemin d’accĂšs** { #step-4-define-the-path-operation-function } ### Étape 4 : dĂ©finir la **fonction de chemin d’accĂšs** { #step-4-define-the-path-operation-function }
Voici notre « fonction de chemin d’accĂšs » : Voici notre **« fonction de chemin d’accĂšs »** :
* **chemin** : `/`. * **chemin** : `/`.
* **opération** : `get`. * **opération** : `get`.
@ -365,7 +365,7 @@ Voici notre « fonction de chemin d’accĂšs » :
C’est une fonction Python. C’est une fonction Python.
Elle sera appelĂ©e par **FastAPI** chaque fois qu’il recevra une requĂȘte vers l’URL « / » en utilisant une opĂ©ration `GET`. Elle sera appelĂ©e par **FastAPI** chaque fois qu’il recevra une requĂȘte vers l’URL « `/` » en utilisant une opĂ©ration `GET`.
Dans ce cas, c’est une fonction `async`. Dans ce cas, c’est une fonction `async`.
@ -377,7 +377,7 @@ Vous pouvez aussi la définir comme une fonction normale au lieu de `async def`
/// note | Remarque /// note | Remarque
Si vous ne connaissez pas la différence, consultez [Asynchrone : « Pressé ? »](../async.md#in-a-hurry). Si vous ne connaissez pas la différence, consultez [Asynchrone : *« Pressé ? »*](../async.md#in-a-hurry).
/// ///

4
docs/fr/docs/tutorial/handling-errors.md

@ -43,7 +43,7 @@ Dans cet exemple, lorsque le client demande un élément par un ID qui n'existe
### Réponse résultante { #the-resulting-response } ### Réponse résultante { #the-resulting-response }
Si le client demande `http://example.com/items/foo` (un `item_id` « foo »), il recevra un code d'état HTTP 200 et une réponse JSON : Si le client demande `http://example.com/items/foo` (un `item_id` `"foo"`), il recevra un code d'état HTTP 200 et une réponse JSON :
```JSON ```JSON
{ {
@ -51,7 +51,7 @@ Si le client demande `http://example.com/items/foo` (un `item_id` « foo »), il
} }
``` ```
Mais si le client demande `http://example.com/items/bar` (un `item_id` inexistant « bar »), il recevra un code d'état HTTP 404 (l'erreur « not found ») et une réponse JSON : Mais si le client demande `http://example.com/items/bar` (un `item_id` inexistant `"bar"`), il recevra un code d'état HTTP 404 (l'erreur « not found ») et une réponse JSON :
```JSON ```JSON
{ {

1
docs/fr/docs/tutorial/index.md

@ -1,5 +1,6 @@
# Tutoriel - Guide utilisateur { #tutorial-user-guide } # Tutoriel - Guide utilisateur { #tutorial-user-guide }
Ce tutoriel vous montre comment utiliser **FastAPI** avec la plupart de ses fonctionnalités, étape par étape. Ce tutoriel vous montre comment utiliser **FastAPI** avec la plupart de ses fonctionnalités, étape par étape.
Chaque section s'appuie progressivement sur les précédentes, mais elle est structurée de maniÚre à séparer les sujets, afin que vous puissiez aller directement à l'un d'entre eux pour répondre à vos besoins spécifiques d'API. Chaque section s'appuie progressivement sur les précédentes, mais elle est structurée de maniÚre à séparer les sujets, afin que vous puissiez aller directement à l'un d'entre eux pour répondre à vos besoins spécifiques d'API.

2
docs/fr/docs/tutorial/metadata.md

@ -11,7 +11,7 @@ Vous pouvez définir les champs suivants qui sont utilisés dans la spécificati
| `title` | `str` | Le titre de l’API. | | `title` | `str` | Le titre de l’API. |
| `summary` | `str` | Un court rĂ©sumĂ© de l’API. <small>Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0.</small> | | `summary` | `str` | Un court rĂ©sumĂ© de l’API. <small>Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0.</small> |
| `description` | `str` | Une brùve description de l’API. Elle peut utiliser Markdown. | | `description` | `str` | Une brùve description de l’API. Elle peut utiliser Markdown. |
| `version` | `string` | La version de l’API. C’est la version de votre propre application, pas d’OpenAPI. Par exemple `2.5.0`. | | `version` | `str` | La version de l’API. C’est la version de votre propre application, pas d’OpenAPI. Par exemple `2.5.0`. |
| `terms_of_service` | `str` | Une URL vers les Conditions d’utilisation de l’API. Le cas Ă©chĂ©ant, il doit s’agir d’une URL. | | `terms_of_service` | `str` | Une URL vers les Conditions d’utilisation de l’API. Le cas Ă©chĂ©ant, il doit s’agir d’une URL. |
| `contact` | `dict` | Les informations de contact pour l’API exposĂ©e. Cela peut contenir plusieurs champs. <details><summary>champs de <code>contact</code></summary><table><thead><tr><th>ParamĂštre</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>Le nom identifiant de la personne/organisation de contact.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>L’URL pointant vers les informations de contact. DOIT ĂȘtre au format d’une URL.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>L’adresse e-mail de la personne/organisation de contact. DOIT ĂȘtre au format d’une adresse e-mail.</td></tr></tbody></table></details> | | `contact` | `dict` | Les informations de contact pour l’API exposĂ©e. Cela peut contenir plusieurs champs. <details><summary>champs de <code>contact</code></summary><table><thead><tr><th>ParamĂštre</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>Le nom identifiant de la personne/organisation de contact.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>L’URL pointant vers les informations de contact. DOIT ĂȘtre au format d’une URL.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>L’adresse e-mail de la personne/organisation de contact. DOIT ĂȘtre au format d’une adresse e-mail.</td></tr></tbody></table></details> |
| `license_info` | `dict` | Les informations de licence pour l’API exposĂ©e. Cela peut contenir plusieurs champs. <details><summary>champs de <code>license_info</code></summary><table><thead><tr><th>ParamĂštre</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>OBLIGATOIRE</strong> (si un <code>license_info</code> est dĂ©fini). Le nom de la licence utilisĂ©e pour l’API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>Une expression de licence [SPDX](https://spdx.org/licenses/) pour l’API. Le champ <code>identifier</code> est mutuellement exclusif du champ <code>url</code>. <small>Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>Une URL vers la licence utilisĂ©e pour l’API. DOIT ĂȘtre au format d’une URL.</td></tr></tbody></table></details> | | `license_info` | `dict` | Les informations de licence pour l’API exposĂ©e. Cela peut contenir plusieurs champs. <details><summary>champs de <code>license_info</code></summary><table><thead><tr><th>ParamĂštre</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>OBLIGATOIRE</strong> (si un <code>license_info</code> est dĂ©fini). Le nom de la licence utilisĂ©e pour l’API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>Une expression de licence [SPDX](https://spdx.org/licenses/) pour l’API. Le champ <code>identifier</code> est mutuellement exclusif du champ <code>url</code>. <small>Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>Une URL vers la licence utilisĂ©e pour l’API. DOIT ĂȘtre au format d’une URL.</td></tr></tbody></table></details> |

1
docs/fr/docs/tutorial/path-operation-configuration.md

@ -1,5 +1,6 @@
# Configurer les chemins d'accĂšs { #path-operation-configuration } # Configurer les chemins d'accĂšs { #path-operation-configuration }
Vous pouvez passer plusieurs paramÚtres à votre *décorateur de chemin d'accÚs* pour le configurer. Vous pouvez passer plusieurs paramÚtres à votre *décorateur de chemin d'accÚs* pour le configurer.
/// warning | Alertes /// warning | Alertes

8
docs/fr/docs/tutorial/query-params-str-validations.md

@ -81,7 +81,7 @@ FastAPI va maintenant :
- **Valider** les donnĂ©es en s’assurant que la longueur maximale est de 50 caractĂšres - **Valider** les donnĂ©es en s’assurant que la longueur maximale est de 50 caractĂšres
- Afficher une **erreur claire** au client quand les données ne sont pas valides - Afficher une **erreur claire** au client quand les données ne sont pas valides
- **Documenter** le paramĂštre dans la *chemin d'accĂšs* du schĂ©ma OpenAPI (il apparaĂźtra donc dans l’**interface de documentation automatique**) - **Documenter** le paramĂštre dans le *chemin d'accĂšs* du schĂ©ma OpenAPI (il apparaĂźtra donc dans l’**interface de documentation automatique**)
## Alternative (ancienne) : `Query` comme valeur par défaut { #alternative-old-query-as-the-default-value } ## Alternative (ancienne) : `Query` comme valeur par défaut { #alternative-old-query-as-the-default-value }
@ -89,7 +89,7 @@ Les versions précédentes de FastAPI (avant <dfn title="avant 2023-03">0.95.0</
/// tip | Astuce /// tip | Astuce
Pour du nouveau code et dĂšs que possible, utilisez `Annotated` comme expliquĂ© ci-dessus. Il y a de multiples avantages (expliquĂ©s ci-dessous) et aucun inconvĂ©nient. 🍰 Pour du nouveau code et chaque fois que possible, utilisez `Annotated` comme expliquĂ© ci-dessus. Il y a de multiples avantages (expliquĂ©s ci-dessous) et aucun inconvĂ©nient. 🍰
/// ///
@ -119,7 +119,7 @@ Ensuite, nous pouvons passer plus de paramĂštres Ă  `Query`. Dans ce cas, le par
q: str | None = Query(default=None, max_length=50) q: str | None = Query(default=None, max_length=50)
``` ```
Cela validera les données, affichera une erreur claire lorsque les données ne sont pas valides et documentera le paramÚtre dans la *chemin d'accÚs* du schéma OpenAPI. Cela validera les données, affichera une erreur claire lorsque les données ne sont pas valides et documentera le paramÚtre dans le *chemin d'accÚs* du schéma OpenAPI.
### `Query` comme valeur par défaut ou dans `Annotated` { #query-as-the-default-value-or-in-annotated } ### `Query` comme valeur par défaut ou dans `Annotated` { #query-as-the-default-value-or-in-annotated }
@ -241,7 +241,7 @@ Ensuite, avec une URL comme :
http://localhost:8000/items/?q=foo&q=bar http://localhost:8000/items/?q=foo&q=bar
``` ```
vous recevriez les valeurs des multiples paramĂštres de requĂȘte `q` (`foo` et `bar`) dans une `list` Python Ă  l’intĂ©rieur de votre fonction de *chemin d'accĂšs*, dans le *paramĂštre de fonction* `q`. vous recevriez les valeurs des multiples paramĂštres de requĂȘte `q` (`foo` et `bar`) dans une `list` Python Ă  l’intĂ©rieur de votre *fonction de chemin d'accĂšs*, dans le *paramĂštre de fonction* `q`.
Donc, la réponse pour cette URL serait : Donc, la réponse pour cette URL serait :

3
docs/fr/docs/tutorial/query-params.md

@ -1,6 +1,6 @@
# ParamĂštres de requĂȘte { #query-parameters } # ParamĂštres de requĂȘte { #query-parameters }
Quand vous dĂ©clarez d'autres paramĂštres de fonction qui ne font pas partie des paramĂštres de chemin, ils sont automatiquement interprĂ©tĂ©s comme des paramĂštres de « query ». Quand vous dĂ©clarez d'autres paramĂštres de fonction qui ne font pas partie des paramĂštres de chemin, ils sont automatiquement interprĂ©tĂ©s comme des paramĂštres de requĂȘte.
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *} {* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
@ -109,6 +109,7 @@ http://127.0.0.1:8000/items/foo?short=yes
ou n'importe quelle autre variation de casse (tout en majuscules, uniquement la premiĂšre lettre en majuscule, etc.), votre fonction verra le paramĂštre `short` avec une valeur `bool` Ă  `True`. Sinon la valeur sera Ă  `False`. ou n'importe quelle autre variation de casse (tout en majuscules, uniquement la premiĂšre lettre en majuscule, etc.), votre fonction verra le paramĂštre `short` avec une valeur `bool` Ă  `True`. Sinon la valeur sera Ă  `False`.
## Multiples paramĂštres de chemin et de requĂȘte { #multiple-path-and-query-parameters } ## Multiples paramĂštres de chemin et de requĂȘte { #multiple-path-and-query-parameters }
Vous pouvez dĂ©clarer plusieurs paramĂštres de chemin et paramĂštres de requĂȘte en mĂȘme temps, **FastAPI** sait lequel est lequel. Vous pouvez dĂ©clarer plusieurs paramĂštres de chemin et paramĂštres de requĂȘte en mĂȘme temps, **FastAPI** sait lequel est lequel.

1
docs/fr/docs/tutorial/request-files.md

@ -1,5 +1,6 @@
# Envoyer des fichiers { #request-files } # Envoyer des fichiers { #request-files }
Vous pouvez définir des fichiers à téléverser par le client en utilisant `File`. Vous pouvez définir des fichiers à téléverser par le client en utilisant `File`.
/// note | Remarque /// note | Remarque

2
docs/fr/docs/tutorial/request-forms.md

@ -56,7 +56,7 @@ Les données issues des formulaires sont normalement encodées avec le « type d
Mais lorsque le formulaire inclut des fichiers, il est encodé en `multipart/form-data`. Vous lirez la gestion des fichiers dans le chapitre suivant. Mais lorsque le formulaire inclut des fichiers, il est encodé en `multipart/form-data`. Vous lirez la gestion des fichiers dans le chapitre suivant.
Si vous voulez en savoir plus sur ces encodages et les champs de formulaire, consultez la [<abbr title="Mozilla Developer Network - Réseau des développeurs Mozilla">MDN</abbr> web docs pour `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). Si vous voulez en savoir plus sur ces encodages et les champs de formulaire, consultez les [documents web de la <abbr title="Mozilla Developer Network - Réseau des développeurs Mozilla">MDN</abbr> pour `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
/// ///

1
docs/fr/docs/tutorial/response-status-code.md

@ -1,5 +1,6 @@
# Code d'état de la réponse { #response-status-code } # Code d'état de la réponse { #response-status-code }
De la mĂȘme maniĂšre que vous pouvez spĂ©cifier un modĂšle de rĂ©ponse, vous pouvez Ă©galement dĂ©clarer le code d'Ă©tat HTTP utilisĂ© pour la rĂ©ponse avec le paramĂštre `status_code` dans n'importe lequel des chemins d'accĂšs : De la mĂȘme maniĂšre que vous pouvez spĂ©cifier un modĂšle de rĂ©ponse, vous pouvez Ă©galement dĂ©clarer le code d'Ă©tat HTTP utilisĂ© pour la rĂ©ponse avec le paramĂštre `status_code` dans n'importe lequel des chemins d'accĂšs :
* `@app.get()` * `@app.get()`

14
docs/fr/docs/tutorial/schema-extra-example.md

@ -1,6 +1,6 @@
# DĂ©clarer des exemples de donnĂ©es de requĂȘte { #declare-request-example-data } # DĂ©clarer des exemples de donnĂ©es de requĂȘte { #declare-request-example-data }
Vous pouvez déclarer des exemples des données que votre application peut recevoir. Vous pouvez déclarer des exemples de données que votre application peut recevoir.
Voici plusieurs façons de le faire. Voici plusieurs façons de le faire.
@ -10,9 +10,9 @@ Vous pouvez déclarer `examples` pour un modÚle Pydantic qui seront ajoutés au
{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
Ces informations supplémentaires seront ajoutées telles quelles au **JSON Schema** de sortie pour ce modÚle, et elles seront utilisées dans la documentation de l'API. Ces informations supplémentaires seront ajoutées telles quelles au **JSON Schema** de sortie pour ce modÚle, et elles seront utilisées dans les documents de l'API.
Vous pouvez utiliser l'attribut `model_config` qui accepte un `dict` comme décrit dans [Documentation de Pydantic : Configuration](https://docs.pydantic.dev/latest/api/config/). Vous pouvez utiliser l'attribut `model_config` qui accepte un `dict` comme décrit dans [documents de Pydantic : Configuration](https://docs.pydantic.dev/latest/api/config/).
Vous pouvez définir `"json_schema_extra"` avec un `dict` contenant toutes les données supplémentaires que vous souhaitez voir apparaßtre dans le JSON Schema généré, y compris `examples`. Vous pouvez définir `"json_schema_extra"` avec un `dict` contenant toutes les données supplémentaires que vous souhaitez voir apparaßtre dans le JSON Schema généré, y compris `examples`.
@ -28,7 +28,7 @@ Par exemple, vous pourriez l'utiliser pour ajouter des métadonnées pour une in
OpenAPI 3.1.0 (utilisé depuis FastAPI 0.99.0) a ajouté la prise en charge de `examples`, qui fait partie du standard **JSON Schema**. OpenAPI 3.1.0 (utilisé depuis FastAPI 0.99.0) a ajouté la prise en charge de `examples`, qui fait partie du standard **JSON Schema**.
Avant cela, seule la clĂ© `example` avec un exemple unique Ă©tait prise en charge. Elle l'est toujours par OpenAPI 3.1.0, mais elle est dĂ©prĂ©ciĂ©e et ne fait pas partie du standard JSON Schema. Vous ĂȘtes donc encouragĂ© Ă  migrer de `example` vers `examples`. đŸ€“ Avant cela, seul le mot-clĂ© `example` avec un exemple unique Ă©tait pris en charge. Il l'est toujours par OpenAPI 3.1.0, mais il est dĂ©prĂ©ciĂ© et ne fait pas partie du standard JSON Schema. Vous ĂȘtes donc encouragĂ© Ă  migrer de `example` vers `examples`. đŸ€“
Vous pouvez en lire davantage Ă  la fin de cette page. Vous pouvez en lire davantage Ă  la fin de cette page.
@ -173,7 +173,7 @@ Ce nouveau champ `examples` dans JSON Schema est **juste une `list`** d'exemples
/// note | Remarque /// note | Remarque
MĂȘme aprĂšs la sortie d'OpenAPI 3.1.0 avec cette nouvelle intĂ©gration plus simple avec JSON Schema, pendant un temps, Swagger UI, l'outil qui fournit la documentation automatique, ne prenait pas en charge OpenAPI 3.1.0 (il le fait depuis la version 5.0.0 🎉). MĂȘme aprĂšs la sortie d'OpenAPI 3.1.0 avec cette nouvelle intĂ©gration plus simple avec JSON Schema, pendant un temps, Swagger UI, l'outil qui fournit les documents automatiques, ne prenait pas en charge OpenAPI 3.1.0 (il le fait depuis la version 5.0.0 🎉).
À cause de cela, les versions de FastAPI antĂ©rieures Ă  0.99.0 utilisaient encore des versions d'OpenAPI infĂ©rieures Ă  3.1.0. À cause de cela, les versions de FastAPI antĂ©rieures Ă  0.99.0 utilisaient encore des versions d'OpenAPI infĂ©rieures Ă  3.1.0.
@ -183,7 +183,7 @@ MĂȘme aprĂšs la sortie d'OpenAPI 3.1.0 avec cette nouvelle intĂ©gration plus sim
Lorsque vous ajoutez `examples` dans un modÚle Pydantic, en utilisant `schema_extra` ou `Field(examples=["something"])`, cet exemple est ajouté au **JSON Schema** de ce modÚle Pydantic. Lorsque vous ajoutez `examples` dans un modÚle Pydantic, en utilisant `schema_extra` ou `Field(examples=["something"])`, cet exemple est ajouté au **JSON Schema** de ce modÚle Pydantic.
Et ce **JSON Schema** du modÚle Pydantic est inclus dans l'**OpenAPI** de votre API, puis il est utilisé dans l'interface de la documentation. Et ce **JSON Schema** du modÚle Pydantic est inclus dans l'**OpenAPI** de votre API, puis il est utilisé dans l'interface des documents.
Dans les versions de FastAPI antĂ©rieures Ă  0.99.0 (0.99.0 et supĂ©rieures utilisent le nouveau OpenAPI 3.1.0), lorsque vous utilisiez `example` ou `examples` avec l'une des autres utilitaires (`Query()`, `Body()`, etc.), ces exemples n'Ă©taient pas ajoutĂ©s au JSON Schema qui dĂ©crit ces donnĂ©es (pas mĂȘme Ă  la version de JSON Schema propre Ă  OpenAPI), ils Ă©taient ajoutĂ©s directement Ă  la dĂ©claration du *chemin d'accĂšs* dans OpenAPI (en dehors des parties d'OpenAPI qui utilisent JSON Schema). Dans les versions de FastAPI antĂ©rieures Ă  0.99.0 (0.99.0 et supĂ©rieures utilisent le nouveau OpenAPI 3.1.0), lorsque vous utilisiez `example` ou `examples` avec l'une des autres utilitaires (`Query()`, `Body()`, etc.), ces exemples n'Ă©taient pas ajoutĂ©s au JSON Schema qui dĂ©crit ces donnĂ©es (pas mĂȘme Ă  la version de JSON Schema propre Ă  OpenAPI), ils Ă©taient ajoutĂ©s directement Ă  la dĂ©claration du *chemin d'accĂšs* dans OpenAPI (en dehors des parties d'OpenAPI qui utilisent JSON Schema).
@ -191,7 +191,7 @@ Mais maintenant que FastAPI 0.99.0 et supérieures utilisent OpenAPI 3.1.0, qui
### Swagger UI et `examples` spécifiques à OpenAPI { #swagger-ui-and-openapi-specific-examples } ### Swagger UI et `examples` spécifiques à OpenAPI { #swagger-ui-and-openapi-specific-examples }
Comme Swagger UI ne prenait pas en charge plusieurs exemples JSON Schema (au 2023-08-26), les utilisateurs n'avaient pas de moyen d'afficher plusieurs exemples dans les documents. Maintenant, comme Swagger UI ne prenait pas en charge plusieurs exemples JSON Schema (au 2023-08-26), les utilisateurs n'avaient pas de moyen d'afficher plusieurs exemples dans les documents.
Pour rĂ©soudre cela, FastAPI `0.103.0` a **ajoutĂ© la prise en charge** de la dĂ©claration du mĂȘme ancien champ `examples` **spĂ©cifique Ă  OpenAPI** avec le nouveau paramĂštre `openapi_examples`. đŸ€“ Pour rĂ©soudre cela, FastAPI `0.103.0` a **ajoutĂ© la prise en charge** de la dĂ©claration du mĂȘme ancien champ `examples` **spĂ©cifique Ă  OpenAPI** avec le nouveau paramĂštre `openapi_examples`. đŸ€“

36
docs/fr/docs/tutorial/security/first-steps.md

@ -54,7 +54,7 @@ $ fastapi dev
## Vérifier { #check-it } ## Vérifier { #check-it }
Allez à la documentation interactive à l'adresse : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Allez aux documents interactifs à l'adresse : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Vous verrez quelque chose comme ceci : Vous verrez quelque chose comme ceci :
@ -98,19 +98,19 @@ Mais dans ce cas, la mĂȘme application **FastAPI** gĂ©rera l'API et l'authentifi
Voyons cela selon ce point de vue simplifié : Voyons cela selon ce point de vue simplifié :
- L'utilisateur saisit le `username` et le `password` dans le frontend, puis appuie sur Entrée. * L'utilisateur saisit le `username` et le `password` dans le frontend, puis appuie sur Entrée.
- Le frontend (exécuté dans le navigateur de l'utilisateur) envoie ce `username` et ce `password` vers une URL spécifique de notre API (déclarée avec `tokenUrl="token"`). * Le frontend (exécuté dans le navigateur de l'utilisateur) envoie ce `username` et ce `password` vers une URL spécifique de notre API (déclarée avec `tokenUrl="token"`).
- L'API vérifie ce `username` et ce `password`, et répond avec un « token » (nous n'avons encore rien implémenté de tout cela). * L'API vérifie ce `username` et ce `password`, et répond avec un « token » (nous n'avons encore rien implémenté de tout cela).
- Un « token » n'est qu'une chaßne contenant des informations que nous pouvons utiliser plus tard pour vérifier cet utilisateur. * Un « token » n'est qu'une chaßne contenant des informations que nous pouvons utiliser plus tard pour vérifier cet utilisateur.
- Normalement, un token est configuré pour expirer aprÚs un certain temps. * Normalement, un token est configuré pour expirer aprÚs un certain temps.
- Ainsi, l'utilisateur devra se reconnecter à un moment donné. * Ainsi, l'utilisateur devra se reconnecter à un moment donné.
- Et si le token est volé, le risque est moindre. Ce n'est pas une clé permanente qui fonctionnerait indéfiniment (dans la plupart des cas). * Et si le token est volé, le risque est moindre. Ce n'est pas une clé permanente qui fonctionnerait indéfiniment (dans la plupart des cas).
- Le frontend stocke ce token temporairement quelque part. * Le frontend stocke ce token temporairement quelque part.
- L'utilisateur clique dans le frontend pour aller vers une autre section de l'application web frontend. * L'utilisateur clique dans le frontend pour aller vers une autre section de l'application web frontend.
- Le frontend doit récupérer d'autres données depuis l'API. * Le frontend doit récupérer d'autres données depuis l'API.
- Mais cela nécessite une authentification pour cet endpoint spécifique. * Mais cela nécessite une authentification pour cet endpoint spécifique.
- Donc, pour s'authentifier auprĂšs de notre API, il envoie un en-tĂȘte `Authorization` avec une valeur `Bearer ` suivie du token. * Donc, pour s'authentifier auprĂšs de notre API, il envoie un en-tĂȘte `Authorization` avec une valeur `Bearer ` suivie du token.
- Si le token contient `foobar`, le contenu de l'en-tĂȘte `Authorization` serait : `Bearer foobar`. * Si le token contient `foobar`, le contenu de l'en-tĂȘte `Authorization` serait : `Bearer foobar`.
## Le `OAuth2PasswordBearer` de **FastAPI** { #fastapis-oauth2passwordbearer } ## Le `OAuth2PasswordBearer` de **FastAPI** { #fastapis-oauth2passwordbearer }
@ -172,15 +172,15 @@ Vous pouvez maintenant passer ce `oauth2_scheme` en dépendance avec `Depends`.
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *} {* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
Cette dépendance fournira une `str` qui est affectée au paramÚtre `token` de la fonction de *chemin d'accÚs*. Cette dépendance fournira une `str` qui est affectée au paramÚtre `token` de la *fonction de chemin d'accÚs*.
**FastAPI** saura qu'il peut utiliser cette dépendance pour définir un « schéma de sécurité » dans le schéma OpenAPI (et la documentation API automatique). **FastAPI** saura qu'il peut utiliser cette dépendance pour définir un « schéma de sécurité » dans le schéma OpenAPI (et les documents automatiques de l'API).
/// note | Détails techniques /// note | Détails techniques
**FastAPI** saura qu'il peut utiliser la classe `OAuth2PasswordBearer` (déclarée dans une dépendance) pour définir le schéma de sécurité dans OpenAPI parce qu'elle hérite de `fastapi.security.oauth2.OAuth2`, qui hérite à son tour de `fastapi.security.base.SecurityBase`. **FastAPI** saura qu'il peut utiliser la classe `OAuth2PasswordBearer` (déclarée dans une dépendance) pour définir le schéma de sécurité dans OpenAPI parce qu'elle hérite de `fastapi.security.oauth2.OAuth2`, qui hérite à son tour de `fastapi.security.base.SecurityBase`.
Tous les utilitaires de sécurité qui s'intÚgrent à OpenAPI (et à la documentation API automatique) héritent de `SecurityBase`, c'est ainsi que **FastAPI** sait comment les intégrer dans OpenAPI. Tous les utilitaires de sécurité qui s'intÚgrent à OpenAPI (et aux documents automatiques de l'API) héritent de `SecurityBase`, c'est ainsi que **FastAPI** sait comment les intégrer dans OpenAPI.
/// ///
@ -192,7 +192,7 @@ S'il ne voit pas d'en-tĂȘte `Authorization`, ou si la valeur n'a pas de token `B
Vous n'avez mĂȘme pas Ă  vĂ©rifier si le token existe pour renvoyer une erreur. Vous pouvez ĂȘtre sĂ»r que si votre fonction est exĂ©cutĂ©e, elle aura une `str` dans ce token. Vous n'avez mĂȘme pas Ă  vĂ©rifier si le token existe pour renvoyer une erreur. Vous pouvez ĂȘtre sĂ»r que si votre fonction est exĂ©cutĂ©e, elle aura une `str` dans ce token.
Vous pouvez déjà l'essayer dans la documentation interactive : Vous pouvez déjà l'essayer dans les documents interactifs :
<img src="/img/tutorial/security/image03.png"> <img src="/img/tutorial/security/image03.png">

2
docs/fr/docs/tutorial/security/get-current-user.md

@ -14,7 +14,7 @@ Commençons par créer un modÚle d'utilisateur Pydantic.
De la mĂȘme maniĂšre que nous utilisons Pydantic pour dĂ©clarer des corps de requĂȘte, nous pouvons l'utiliser ailleurs : De la mĂȘme maniĂšre que nous utilisons Pydantic pour dĂ©clarer des corps de requĂȘte, nous pouvons l'utiliser ailleurs :
{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} {* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Créer une dépendance `get_current_user` { #create-a-get-current-user-dependency } ## Créer une dépendance `get_current_user` { #create-a-get-current-user-dependency }

12
docs/fr/docs/tutorial/security/oauth2-jwt.md

@ -58,7 +58,7 @@ Chaque fois que vous fournissez exactement le mĂȘme contenu (exactement le mĂȘme
Mais vous ne pouvez pas convertir le charabia en sens inverse vers le mot de passe. Mais vous ne pouvez pas convertir le charabia en sens inverse vers le mot de passe.
### Pourquoi utiliser le hachage de mot passe { #why-use-password-hashing } ### Pourquoi utiliser le hachage de mot de passe { #why-use-password-hashing }
Si votre base de données est volée, le voleur n'aura pas les mots de passe en clair de vos utilisateurs, seulement les hachages. Si votre base de données est volée, le voleur n'aura pas les mots de passe en clair de vos utilisateurs, seulement les hachages.
@ -120,7 +120,7 @@ Et une autre pour authentifier et renvoyer un utilisateur.
Lorsque `authenticate_user` est appelĂ©e avec un nom d'utilisateur qui n'existe pas dans la base de donnĂ©es, nous exĂ©cutons tout de mĂȘme `verify_password` contre un hachage factice. Lorsque `authenticate_user` est appelĂ©e avec un nom d'utilisateur qui n'existe pas dans la base de donnĂ©es, nous exĂ©cutons tout de mĂȘme `verify_password` contre un hachage factice.
Cela garantit que le point de terminaison met approximativement le mĂȘme temps Ă  rĂ©pondre que le nom d'utilisateur soit valide ou non, empĂȘchant des **attaques temporelles** qui pourraient ĂȘtre utilisĂ©es pour Ă©numĂ©rer les noms d'utilisateur existants. Cela garantit que l'endpoint met approximativement le mĂȘme temps Ă  rĂ©pondre que le nom d'utilisateur soit valide ou non, empĂȘchant des **attaques temporelles** qui pourraient ĂȘtre utilisĂ©es pour Ă©numĂ©rer les noms d'utilisateur existants.
/// note | Remarque /// note | Remarque
@ -152,7 +152,7 @@ Créez une variable `ALGORITHM` avec l'algorithme utilisé pour signer le jeton
Créez une variable pour l'expiration du jeton. Créez une variable pour l'expiration du jeton.
Définissez un modÚle Pydantic qui sera utilisé dans le point de terminaison du jeton pour la réponse. Définissez un modÚle Pydantic qui sera utilisé dans l'endpoint du jeton pour la réponse.
Créez une fonction utilitaire pour générer un nouveau jeton d'accÚs. Créez une fonction utilitaire pour générer un nouveau jeton d'accÚs.
@ -200,7 +200,7 @@ L'important à garder à l'esprit est que la clé `sub` doit contenir un identif
## Vérifier { #check-it } ## Vérifier { #check-it }
Lancez le serveur et allez à la documentation : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Lancez le serveur et accédez aux documents : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Vous verrez l'interface utilisateur suivante : Vous verrez l'interface utilisateur suivante :
@ -215,13 +215,13 @@ Mot de passe : `secret`
/// tip | Astuce /// tip | Astuce
Remarquez qu'à aucun endroit du code le mot de passe en clair « secret » n'apparaßt, nous n'avons que la version hachée. Remarquez qu'à aucun endroit du code le mot de passe en clair « `secret` » n'apparaßt, nous n'avons que la version hachée.
/// ///
<img src="/img/tutorial/security/image08.png"> <img src="/img/tutorial/security/image08.png">
Appelez le point de terminaison `/users/me/`, vous obtiendrez la réponse suivante : Appelez l'endpoint `/users/me/`, vous obtiendrez la réponse suivante :
```JSON ```JSON
{ {

18
docs/fr/docs/tutorial/security/simple-oauth2.md

@ -14,13 +14,13 @@ Mais ne vous inquiétez pas, vous pouvez l'afficher comme vous le souhaitez à v
Et vos modÚles de base de données peuvent utiliser les noms que vous voulez. Et vos modÚles de base de données peuvent utiliser les noms que vous voulez.
Mais pour le chemin d'accĂšs de connexion, nous devons utiliser ces noms pour ĂȘtre compatibles avec la spĂ©cification (et pouvoir, par exemple, utiliser le systĂšme de documentation API intĂ©grĂ©). Mais pour le *chemin d'accĂšs* de connexion, nous devons utiliser ces noms pour ĂȘtre compatibles avec la spĂ©cification (et pouvoir, par exemple, utiliser le systĂšme de documentation API intĂ©grĂ©).
La spĂ©cification prĂ©cise Ă©galement que `username` et `password` doivent ĂȘtre envoyĂ©s en donnĂ©es de formulaire (donc pas de JSON ici). La spĂ©cification prĂ©cise Ă©galement que `username` et `password` doivent ĂȘtre envoyĂ©s en donnĂ©es de formulaire (donc pas de JSON ici).
### `scope` { #scope } ### `scope` { #scope }
La spécification indique aussi que le client peut envoyer un autre champ de formulaire « scope ». La spécification indique aussi que le client peut envoyer un autre champ de formulaire « `scope` ».
Le nom du champ de formulaire est `scope` (au singulier), mais il s'agit en fait d'une longue chaßne contenant des « scopes » séparés par des espaces. Le nom du champ de formulaire est `scope` (au singulier), mais il s'agit en fait d'une longue chaßne contenant des « scopes » séparés par des espaces.
@ -50,7 +50,7 @@ Utilisons maintenant les utilités fournies par **FastAPI** pour gérer cela.
### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform } ### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }
Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que dépendance avec `Depends` dans le chemin d'accÚs pour `/token` : Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que dépendance avec `Depends` dans le *chemin d'accÚs* pour `/token` :
{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *} {* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}
@ -63,7 +63,7 @@ Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que d
/// tip | Astuce /// tip | Astuce
La spécification OAuth2 exige en réalité un champ `grant_type` avec la valeur fixe `password`, mais `OAuth2PasswordRequestForm` ne l'impose pas. La spécification OAuth2 *exige* en réalité un champ `grant_type` avec la valeur fixe `password`, mais `OAuth2PasswordRequestForm` ne l'impose pas.
Si vous avez besoin de l'imposer, utilisez `OAuth2PasswordRequestFormStrict` au lieu de `OAuth2PasswordRequestForm`. Si vous avez besoin de l'imposer, utilisez `OAuth2PasswordRequestFormStrict` au lieu de `OAuth2PasswordRequestForm`.
@ -132,7 +132,7 @@ Ainsi, il ne pourra pas essayer d'utiliser ces mĂȘmes mots de passe dans un autr
`UserInDB(**user_dict)` signifie : `UserInDB(**user_dict)` signifie :
Passez les clĂ©s et valeurs de `user_dict` directement comme arguments clé‑valeur, Ă©quivalent Ă  : *Passez les clĂ©s et valeurs de `user_dict` directement comme arguments clé‑valeur, Ă©quivalent Ă  :*
```Python ```Python
UserInDB( UserInDB(
@ -146,7 +146,7 @@ UserInDB(
/// note | Remarque /// note | Remarque
Pour une explication plus complÚte de `**user_dict`, consultez [la documentation pour **ModÚles supplémentaires**](../extra-models.md#about-user-in-dict). Pour une explication plus complÚte de `**user_dict`, consultez [la documentation pour **ModÚles supplémentaires**](../extra-models.md#about-user-in-model-dump).
/// ///
@ -154,7 +154,7 @@ Pour une explication plus complĂšte de `**user_dict`, consultez [la documentatio
La rĂ©ponse de l'endpoint `token` doit ĂȘtre un objet JSON. La rĂ©ponse de l'endpoint `token` doit ĂȘtre un objet JSON.
Il doit contenir un `token_type`. Dans notre cas, comme nous utilisons des jetons « Bearer », le type de jeton doit ĂȘtre « bearer ». Il doit contenir un `token_type`. Dans notre cas, comme nous utilisons des jetons « Bearer », le type de jeton doit ĂȘtre « `bearer` ».
Et il doit contenir un `access_token`, avec une chaĂźne contenant notre jeton d'accĂšs. Et il doit contenir un `access_token`, avec une chaĂźne contenant notre jeton d'accĂšs.
@ -186,7 +186,7 @@ Pour le reste, **FastAPI** s'en charge pour vous.
Nous allons maintenant mettre à jour nos dépendances. Nous allons maintenant mettre à jour nos dépendances.
Nous voulons obtenir `current_user` uniquement si cet utilisateur est actif. Nous voulons obtenir `current_user` *uniquement* si cet utilisateur est actif.
Nous créons donc une dépendance supplémentaire `get_current_active_user` qui utilise à son tour `get_current_user` comme dépendance. Nous créons donc une dépendance supplémentaire `get_current_active_user` qui utilise à son tour `get_current_user` comme dépendance.
@ -216,7 +216,7 @@ C'est l'avantage des standards ...
## Voir en action { #see-it-in-action } ## Voir en action { #see-it-in-action }
Ouvrez la documentation interactive : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ouvrez les documents interactifs : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
### S'authentifier { #authenticate } ### S'authentifier { #authenticate }

14
docs/fr/docs/tutorial/sql-databases.md

@ -30,7 +30,7 @@ Il existe un générateur de projet officiel avec **FastAPI** et **PostgreSQL**,
/// ///
Il s'agit d'un tutoriel trÚs simple et court ; si vous souhaitez apprendre sur les bases de données en général, sur SQL, ou des fonctionnalités plus avancées, allez voir la [documentation SQLModel](https://sqlmodel.tiangolo.com/). Il s'agit d'un tutoriel trÚs simple et court ; si vous souhaitez apprendre sur les bases de données en général, sur SQL, ou des fonctionnalités plus avancées, allez voir les [documents de SQLModel](https://sqlmodel.tiangolo.com/).
## Installer `SQLModel` { #install-sqlmodel } ## Installer `SQLModel` { #install-sqlmodel }
@ -57,15 +57,15 @@ Importez `SQLModel` et créez un modÚle de base de données :
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *} {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *}
La classe `Hero` est trÚs similaire à un modÚle Pydantic (en fait, en dessous, c'est réellement un modÚle Pydantic). La classe `Hero` est trÚs similaire à un modÚle Pydantic (en fait, en dessous, c'est réellement *un modÚle Pydantic*).
Il y a quelques différences : Il y a quelques différences :
* `table=True` indique à SQLModel qu'il s'agit d'un *modÚle de table*, il doit représenter une **table** dans la base SQL, ce n'est pas seulement un *modÚle de données* (comme le serait n'importe quelle autre classe Pydantic classique). * `table=True` indique à SQLModel qu'il s'agit d'un *modÚle de table*, il doit représenter une **table** dans la base SQL, ce n'est pas seulement un *modÚle de données* (comme le serait n'importe quelle autre classe Pydantic classique).
* `Field(primary_key=True)` indique à SQLModel que `id` est la **clé primaire** dans la base SQL (vous pouvez en savoir plus sur les clés primaires SQL dans la documentation SQLModel). * `Field(primary_key=True)` indique à SQLModel que `id` est la **clé primaire** dans la base SQL (vous pouvez en savoir plus sur les clés primaires SQL dans les documents de SQLModel).
Remarque : nous utilisons `int | None` pour le champ clé primaire afin qu'en Python nous puissions *créer un objet sans `id`* (`id=None`), en supposant que la base *le génÚre à l'enregistrement*. SQLModel comprend que la base fournira l'`id` et *définit la colonne comme un `INTEGER` non nul* dans le schéma de base. Voir la [documentation SQLModel sur les clés primaires](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) pour plus de détails. **Remarque :** nous utilisons `int | None` pour le champ clé primaire afin qu'en Python nous puissions *créer un objet sans `id`* (`id=None`), en supposant que la base *le génÚre à l'enregistrement*. SQLModel comprend que la base fournira l'`id` et *définit la colonne comme un `INTEGER` non nul* dans le schéma de base. Voir les [documents de SQLModel sur les clés primaires](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) pour plus de détails.
* `Field(index=True)` indique à SQLModel qu'il doit créer un **index SQL** pour cette colonne, ce qui permettra des recherches plus rapides dans la base lors de la lecture de données filtrées par cette colonne. * `Field(index=True)` indique à SQLModel qu'il doit créer un **index SQL** pour cette colonne, ce qui permettra des recherches plus rapides dans la base lors de la lecture de données filtrées par cette colonne.
@ -121,7 +121,7 @@ Comme chaque modĂšle SQLModel est aussi un modĂšle Pydantic, vous pouvez l'utili
Par exemple, si vous déclarez un paramÚtre de type `Hero`, il sera lu depuis le **corps JSON**. Par exemple, si vous déclarez un paramÚtre de type `Hero`, il sera lu depuis le **corps JSON**.
De la mĂȘme maniĂšre, vous pouvez le dĂ©clarer comme **type de retour** de la fonction, et alors la forme des donnĂ©es apparaĂźtra dans l'UI automatique de documentation de l'API. De la mĂȘme maniĂšre, vous pouvez le dĂ©clarer comme **type de retour** de la fonction, et alors la forme des donnĂ©es apparaĂźtra dans l'UI automatique des documents de l'API.
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *} {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *}
@ -173,7 +173,7 @@ Si vous vérifiez l'application précédente, dans l'UI vous pouvez voir que, ju
Nous ne devrions pas laisser cela se produire, ils pourraient Ă©craser un `id` que nous avons dĂ©jĂ  attribuĂ© dans la base. DĂ©cider de l'`id` doit ĂȘtre fait par le **backend** ou la **base**, **pas par le client**. Nous ne devrions pas laisser cela se produire, ils pourraient Ă©craser un `id` que nous avons dĂ©jĂ  attribuĂ© dans la base. DĂ©cider de l'`id` doit ĂȘtre fait par le **backend** ou la **base**, **pas par le client**.
De plus, nous crĂ©ons un `secret_name` pour le hĂ©ros, mais jusqu'ici, nous le renvoyons partout, ce n'est pas trĂšs « secret » ... 😅 De plus, nous crĂ©ons un `secret_name` pour le hĂ©ros, mais jusqu'ici, nous le renvoyons partout, ce n'est pas trĂšs **secret** ... 😅
Nous allons corriger ces choses en ajoutant quelques **modĂšles supplĂ©mentaires**. C'est lĂ  que SQLModel brille. ✹ Nous allons corriger ces choses en ajoutant quelques **modĂšles supplĂ©mentaires**. C'est lĂ  que SQLModel brille. ✹
@ -354,4 +354,4 @@ Si vous allez sur l'UI `/docs` de l'API, vous verrez qu'elle est maintenant Ă  j
Vous pouvez utiliser [**SQLModel**](https://sqlmodel.tiangolo.com/) pour interagir avec une base SQL et simplifier le code avec des *modÚles de données* et des *modÚles de table*. Vous pouvez utiliser [**SQLModel**](https://sqlmodel.tiangolo.com/) pour interagir avec une base SQL et simplifier le code avec des *modÚles de données* et des *modÚles de table*.
Vous pouvez en apprendre beaucoup plus dans la documentation **SQLModel**, il y a un mini [tutoriel plus long sur l'utilisation de SQLModel avec **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 Vous pouvez en apprendre beaucoup plus dans les documents de **SQLModel**, il y a un mini [tutoriel plus long sur l'utilisation de SQLModel avec **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀

8
docs/fr/docs/tutorial/static-files.md

@ -2,6 +2,14 @@
Vous pouvez servir des fichiers statiques automatiquement à partir d'un répertoire en utilisant `StaticFiles`. Vous pouvez servir des fichiers statiques automatiquement à partir d'un répertoire en utilisant `StaticFiles`.
/// tip | Astuce
Si vous devez héberger un frontend, utilisez plutÎt `app.frontend()`, lisez-en davantage dans [Frontend](frontend.md).
`app.frontend()` utilise `StaticFiles` en interne, avec plusieurs avantages supplémentaires pour les frontends, comme la gestion du routing cÎté client.
///
## Utiliser `StaticFiles` { #use-staticfiles } ## Utiliser `StaticFiles` { #use-staticfiles }
- Importer `StaticFiles`. - Importer `StaticFiles`.

4
docs/fr/docs/tutorial/testing.md

@ -12,7 +12,7 @@ Avec cela, vous pouvez utiliser [pytest](https://docs.pytest.org/) directement a
Pour utiliser `TestClient`, installez d’abord [`httpx`](https://www.python-httpx.org). Pour utiliser `TestClient`, installez d’abord [`httpx`](https://www.python-httpx.org).
Vous devez crĂ©er un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple : Vous devez vous assurer de crĂ©er un [environnement virtuel](../virtual-environments.md), de l’activer, puis d’y installer le paquet, par exemple :
```console ```console
$ pip install httpx $ pip install httpx
@ -156,7 +156,7 @@ Si vous avez un modĂšle Pydantic dans votre test et que vous souhaitez envoyer s
Aprùs cela, vous avez simplement besoin d’installer `pytest`. Aprùs cela, vous avez simplement besoin d’installer `pytest`.
Vous devez crĂ©er un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple : Vous devez vous assurer de crĂ©er un [environnement virtuel](../virtual-environments.md), de l’activer, puis d’y installer le paquet, par exemple :
<div class="termy"> <div class="termy">

104
docs/fr/docs/virtual-environments.md

@ -1,6 +1,6 @@
# Environnements virtuels { #virtual-environments } # Environnements virtuels { #virtual-environments }
Lorsque vous travaillez sur des projets Python, vous devriez probablement utiliser un environnement virtuel (ou un mécanisme similaire) pour isoler les packages que vous installez pour chaque projet. Lorsque vous travaillez sur des projets Python, vous devriez probablement utiliser un **environnement virtuel** (ou un mécanisme similaire) pour isoler les packages que vous installez pour chaque projet.
/// note | Remarque /// note | Remarque
@ -10,19 +10,19 @@ Si vous connaissez déjà les environnements virtuels, comment les créer et les
/// tip | Astuce /// tip | Astuce
Un environnement virtuel est diffĂ©rent d’une variable d’environnement. Un **environnement virtuel** est diffĂ©rent d’une **variable d’environnement**.
Une variable d’environnement est une variable du systĂšme qui peut ĂȘtre utilisĂ©e par des programmes. Une **variable d’environnement** est une variable du systĂšme qui peut ĂȘtre utilisĂ©e par des programmes.
Un environnement virtuel est un répertoire contenant certains fichiers. Un **environnement virtuel** est un répertoire contenant certains fichiers.
/// ///
/// note | Remarque /// note | Remarque
Cette page vous apprendra Ă  utiliser les environnements virtuels et Ă  comprendre leur fonctionnement. Cette page vous apprendra Ă  utiliser les **environnements virtuels** et Ă  comprendre leur fonctionnement.
Si vous ĂȘtes prĂȘt Ă  adopter un outil qui gĂšre tout pour vous (y compris l’installation de Python), essayez [uv](https://github.com/astral-sh/uv). Si vous ĂȘtes prĂȘt Ă  adopter un **outil qui gĂšre tout** pour vous (y compris l’installation de Python), essayez [uv](https://github.com/astral-sh/uv).
/// ///
@ -53,11 +53,11 @@ $ cd awesome-project
## Créer un environnement virtuel { #create-a-virtual-environment } ## Créer un environnement virtuel { #create-a-virtual-environment }
Lorsque vous commencez à travailler sur un projet Python pour la premiÚre fois, créez un environnement virtuel <strong><dfn title="il existe d'autres options, il s'agit d'une simple recommandation">dans votre projet</dfn></strong>. Lorsque vous commencez à travailler sur un projet Python **pour la premiÚre fois**, créez un environnement virtuel **<dfn title="il existe d'autres options, il s'agit d'une simple recommandation">dans votre projet</dfn>**.
/// tip | Astuce /// tip | Astuce
Vous n’avez besoin de faire cela qu’une seule fois par projet, pas à chaque fois que vous travaillez. Vous n’avez besoin de faire cela qu’**une seule fois par projet**, pas à chaque fois que vous travaillez.
/// ///
@ -120,7 +120,7 @@ Activez le nouvel environnement virtuel afin que toute commande Python que vous
/// tip | Astuce /// tip | Astuce
Faites cela à chaque fois que vous démarrez une nouvelle session de terminal pour travailler sur le projet. Faites cela **chaque fois** que vous démarrez une **nouvelle session de terminal** pour travailler sur le projet.
/// ///
@ -164,9 +164,9 @@ $ source .venv/Scripts/activate
/// tip | Astuce /// tip | Astuce
Chaque fois que vous installez un nouveau package dans cet environnement, activez de nouveau l’environnement. Chaque fois que vous installez un **nouveau package** dans cet environnement, **activez** de nouveau l’environnement.
Vous vous assurez ainsi que si vous utilisez un programme de terminal (<abbr title="command line interface - interface en ligne de commande">CLI</abbr>) installĂ© par ce package, vous utilisez celui de votre environnement virtuel et non un autre qui pourrait ĂȘtre installĂ© globalement, probablement avec une version diffĂ©rente de celle dont vous avez besoin. Vous vous assurez ainsi que si vous utilisez un **programme de terminal (<abbr title="command line interface - interface en ligne de commande">CLI</abbr>)** installĂ© par ce package, vous utilisez celui de votre environnement virtuel et non un autre qui pourrait ĂȘtre installĂ© globalement, probablement avec une version diffĂ©rente de celle dont vous avez besoin.
/// ///
@ -176,7 +176,7 @@ VĂ©rifiez que l’environnement virtuel est actif (la commande prĂ©cĂ©dente a fo
/// tip | Astuce /// tip | Astuce
C’est facultatif, mais c’est une bonne maniĂšre de vĂ©rifier que tout fonctionne comme prĂ©vu et que vous utilisez l’environnement virtuel voulu. C’est **facultatif**, mais c’est une bonne maniĂšre de **vĂ©rifier** que tout fonctionne comme prĂ©vu et que vous utilisez l’environnement virtuel voulu.
/// ///
@ -220,13 +220,13 @@ Si vous utilisez [`uv`](https://github.com/astral-sh/uv), vous l’utiliserez po
/// ///
Si vous utilisez `pip` pour installer des packages (il est fourni par défaut avec Python), vous devez le mettre à niveau vers la derniÚre version. Si vous utilisez `pip` pour installer des packages (il est fourni par défaut avec Python), vous devez le **mettre à niveau** vers la derniÚre version.
Beaucoup d’erreurs exotiques lors de l’installation d’un package se rĂ©solvent simplement en mettant d’abord `pip` Ă  niveau. Beaucoup d’erreurs exotiques lors de l’installation d’un package se rĂ©solvent simplement en mettant d’abord `pip` Ă  niveau.
/// tip | Astuce /// tip | Astuce
Vous feriez normalement cela une seule fois, juste aprĂšs avoir créé l’environnement virtuel. Vous feriez normalement cela **une seule fois**, juste aprĂšs avoir créé l’environnement virtuel.
/// ///
@ -264,7 +264,7 @@ Cette commande installera pip s’il n’est pas dĂ©jĂ  installĂ© et garantit au
## Ajouter `.gitignore` { #add-gitignore } ## Ajouter `.gitignore` { #add-gitignore }
Si vous utilisez Git (vous devriez), ajoutez un fichier `.gitignore` pour exclure tout ce qui se trouve dans votre `.venv` de Git. Si vous utilisez **Git** (vous devriez), ajoutez un fichier `.gitignore` pour exclure tout ce qui se trouve dans votre `.venv` de Git.
/// tip | Astuce /// tip | Astuce
@ -274,7 +274,7 @@ Si vous avez utilisĂ© [`uv`](https://github.com/astral-sh/uv) pour crĂ©er l’en
/// tip | Astuce /// tip | Astuce
Faites cela une seule fois, juste aprĂšs avoir créé l’environnement virtuel. Faites cela **une seule fois**, juste aprĂšs avoir créé l’environnement virtuel.
/// ///
@ -308,19 +308,19 @@ AprĂšs avoir activĂ© l’environnement, vous pouvez y installer des packages.
/// tip | Astuce /// tip | Astuce
Faites cela une seule fois lorsque vous installez ou mettez à niveau les packages nécessaires à votre projet. Faites cela **une seule fois** lorsque vous installez ou mettez à niveau les packages nécessaires à votre projet.
Si vous devez mettre Ă  niveau une version ou ajouter un nouveau package, vous le referez. Si vous devez mettre Ă  niveau une version ou ajouter un nouveau package, vous le **referez**.
/// ///
### Installer des packages directement { #install-packages-directly } ### Installer des packages directement { #install-packages-directly }
Si vous ĂȘtes pressĂ© et ne souhaitez pas utiliser un fichier pour dĂ©clarer les dĂ©pendances de votre projet, vous pouvez les installer directement. Si vous ĂȘtes pressĂ© et ne souhaitez pas utiliser un fichier pour dĂ©clarer les dĂ©pendances de packages de votre projet, vous pouvez les installer directement.
/// tip | Astuce /// tip | Astuce
C’est une trĂšs bonne idĂ©e de placer les packages et leurs versions nĂ©cessaires Ă  votre programme dans un fichier (par exemple `requirements.txt` ou `pyproject.toml`). C’est une (trĂšs) bonne idĂ©e de placer les packages et leurs versions nĂ©cessaires Ă  votre programme dans un fichier (par exemple `requirements.txt` ou `pyproject.toml`).
/// ///
@ -421,13 +421,13 @@ Par exemple :
/// tip | Astuce /// tip | Astuce
Vous devez normalement faire cela une seule fois, lorsque vous crĂ©ez l’environnement virtuel. Vous devez normalement faire cela seulement **une fois**, lorsque vous crĂ©ez l’environnement virtuel.
/// ///
## DĂ©sactiver l’environnement virtuel { #deactivate-the-virtual-environment } ## DĂ©sactiver l’environnement virtuel { #deactivate-the-virtual-environment }
Une fois que vous avez fini de travailler sur votre projet, vous pouvez dĂ©sactiver l’environnement virtuel. Une fois que vous avez fini de travailler sur votre projet, vous pouvez **dĂ©sactiver** l’environnement virtuel.
<div class="termy"> <div class="termy">
@ -457,17 +457,17 @@ Continuez la lecture. đŸ‘‡đŸ€“
Pour travailler avec FastAPI, vous devez installer [Python](https://www.python.org/). Pour travailler avec FastAPI, vous devez installer [Python](https://www.python.org/).
Ensuite, vous devrez installer FastAPI et tout autre package que vous souhaitez utiliser. Ensuite, vous devez **installer** FastAPI et tout autre **package** que vous souhaitez utiliser.
Pour installer des packages, vous utiliseriez normalement la commande `pip` fournie avec Python (ou des alternatives similaires). Pour installer des packages, vous utiliseriez normalement la commande `pip` fournie avec Python (ou des alternatives similaires).
NĂ©anmoins, si vous utilisez simplement `pip` directement, les packages seraient installĂ©s dans votre environnement Python global (l’installation globale de Python). NĂ©anmoins, si vous utilisez simplement `pip` directement, les packages seraient installĂ©s dans votre **environnement Python global** (l’installation globale de Python).
### Le problĂšme { #the-problem } ### Le problĂšme { #the-problem }
Alors, quel est le problùme d’installer des packages dans l’environnement Python global ? Alors, quel est le problùme d’installer des packages dans l’environnement Python global ?
À un moment donnĂ©, vous finirez probablement par Ă©crire de nombreux programmes diffĂ©rents qui dĂ©pendent de packages diffĂ©rents. Et certains de ces projets sur lesquels vous travaillez dĂ©pendront de versions diffĂ©rentes du mĂȘme package. đŸ˜± À un moment donnĂ©, vous finirez probablement par Ă©crire de nombreux programmes diffĂ©rents qui dĂ©pendent de **packages diffĂ©rents**. Et certains de ces projets sur lesquels vous travaillez dĂ©pendront de **versions diffĂ©rentes** du mĂȘme package. đŸ˜±
Par exemple, vous pourriez crĂ©er un projet appelĂ© `philosophers-stone`, ce programme dĂ©pend d’un autre package appelĂ© **`harry`, en version `1`**. Vous devez donc installer `harry`. Par exemple, vous pourriez crĂ©er un projet appelĂ© `philosophers-stone`, ce programme dĂ©pend d’un autre package appelĂ© **`harry`, en version `1`**. Vous devez donc installer `harry`.
@ -483,7 +483,7 @@ flowchart LR
azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3] azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
``` ```
Mais maintenant, le problùme est que, si vous installez les packages globalement (dans l’environnement global) au lieu de dans un environnement virtuel local, vous devrez choisir quelle version de `harry` installer. Mais maintenant, le problùme est que, si vous installez les packages globalement (dans l’environnement global) au lieu de dans un **environnement virtuel** local, vous devrez choisir quelle version de `harry` installer.
Si vous voulez exĂ©cuter `philosophers-stone`, vous devrez d’abord installer `harry` en version `1`, par exemple avec : Si vous voulez exĂ©cuter `philosophers-stone`, vous devrez d’abord installer `harry` en version `1`, par exemple avec :
@ -519,7 +519,7 @@ $ pip install "harry==3"
Et vous vous retrouverez alors avec `harry` version `3` installé dans votre environnement Python global. Et vous vous retrouverez alors avec `harry` version `3` installé dans votre environnement Python global.
Et si vous essayez d’exĂ©cuter Ă  nouveau `philosophers-stone`, il y a une chance que cela ne fonctionne pas car il a besoin de `harry` version `1`. Et si vous essayez d’exĂ©cuter Ă  nouveau `philosophers-stone`, il y a une chance que cela **ne fonctionne pas** car il a besoin de `harry` version `1`.
```mermaid ```mermaid
flowchart LR flowchart LR
@ -538,13 +538,13 @@ flowchart LR
/// tip | Astuce /// tip | Astuce
Il est trÚs courant que les packages Python fassent de leur mieux pour éviter les changements cassants dans les nouvelles versions, mais il vaut mieux jouer la sécurité et installer de nouvelles versions intentionnellement et lorsque vous pouvez exécuter les tests pour vérifier que tout fonctionne correctement. Il est trÚs courant que les packages Python fassent de leur mieux pour **éviter les changements cassants** dans les **nouvelles versions**, mais il vaut mieux jouer la sécurité et installer de nouvelles versions intentionnellement et lorsque vous pouvez exécuter les tests pour vérifier que tout fonctionne correctement.
/// ///
Maintenant, imaginez cela avec beaucoup d’autres packages dont tous vos projets dĂ©pendent. C’est trĂšs difficile Ă  gĂ©rer. Et vous finiriez probablement par exĂ©cuter certains projets avec des versions incompatibles des packages, sans savoir pourquoi quelque chose ne fonctionne pas. Maintenant, imaginez cela avec **beaucoup** d’autres **packages** dont tous vos **projets dĂ©pendent**. C’est trĂšs difficile Ă  gĂ©rer. Et vous finiriez probablement par exĂ©cuter certains projets avec des **versions incompatibles** des packages, sans savoir pourquoi quelque chose ne fonctionne pas.
De plus, selon votre systĂšme d’exploitation (par exemple Linux, Windows, macOS), il se peut qu’il soit livrĂ© avec Python dĂ©jĂ  installĂ©. Et dans ce cas, il avait probablement des packages prĂ©installĂ©s avec des versions spĂ©cifiques nĂ©cessaires Ă  votre systĂšme. Si vous installez des packages dans l’environnement Python global, vous pourriez finir par casser certains des programmes fournis avec votre systĂšme d’exploitation. De plus, selon votre systĂšme d’exploitation (par exemple Linux, Windows, macOS), il se peut qu’il soit livrĂ© avec Python dĂ©jĂ  installĂ©. Et dans ce cas, il avait probablement des packages prĂ©installĂ©s avec des versions spĂ©cifiques **nĂ©cessaires Ă  votre systĂšme**. Si vous installez des packages dans l’environnement Python global, vous pourriez finir par **casser** certains des programmes fournis avec votre systĂšme d’exploitation.
## OĂč les packages sont-ils installĂ©s { #where-are-packages-installed } ## OĂč les packages sont-ils installĂ©s { #where-are-packages-installed }
@ -566,17 +566,17 @@ $ pip install "fastapi[standard]"
Cela téléchargera un fichier compressé avec le code de FastAPI, normalement depuis [PyPI](https://pypi.org/project/fastapi/). Cela téléchargera un fichier compressé avec le code de FastAPI, normalement depuis [PyPI](https://pypi.org/project/fastapi/).
Il tĂ©lĂ©chargera Ă©galement des fichiers pour d’autres packages dont FastAPI dĂ©pend. Il **tĂ©lĂ©chargera** Ă©galement des fichiers pour d’autres packages dont FastAPI dĂ©pend.
Ensuite, il extraira tous ces fichiers et les placera dans un répertoire de votre ordinateur. Ensuite, il **extraira** tous ces fichiers et les placera dans un répertoire de votre ordinateur.
Par dĂ©faut, il placera ces fichiers tĂ©lĂ©chargĂ©s et extraits dans le rĂ©pertoire fourni avec votre installation de Python, c’est l’environnement global. Par dĂ©faut, il placera ces fichiers tĂ©lĂ©chargĂ©s et extraits dans le rĂ©pertoire fourni avec votre installation de Python, c’est l’**environnement global**.
## Qu’est-ce qu’un environnement virtuel { #what-are-virtual-environments } ## Qu’est-ce qu’un environnement virtuel { #what-are-virtual-environments }
La solution aux problĂšmes posĂ©s par le fait d’avoir tous les packages dans l’environnement global est d’utiliser un environnement virtuel pour chaque projet sur lequel vous travaillez. La solution aux problĂšmes posĂ©s par le fait d’avoir tous les packages dans l’environnement global est d’utiliser un **environnement virtuel pour chaque projet** sur lequel vous travaillez.
Un environnement virtuel est un rĂ©pertoire, trĂšs similaire Ă  celui global, oĂč vous pouvez installer les packages pour un projet. Un environnement virtuel est un **rĂ©pertoire**, trĂšs similaire Ă  celui global, oĂč vous pouvez installer les packages pour un projet.
De cette maniÚre, chaque projet aura son propre environnement virtuel (répertoire `.venv`) avec ses propres packages. De cette maniÚre, chaque projet aura son propre environnement virtuel (répertoire `.venv`) avec ses propres packages.
@ -730,7 +730,7 @@ et utilisera celui-ci.
//// ////
Un dĂ©tail important est qu’il placera le chemin de l’environnement virtuel au dĂ©but de la variable `PATH`. Le systĂšme le trouvera avant de trouver tout autre Python disponible. Ainsi, lorsque vous exĂ©cutez `python`, il utilisera le Python de l’environnement virtuel au lieu de tout autre `python` (par exemple, un `python` d’un environnement global). Un dĂ©tail important est qu’il placera le chemin de l’environnement virtuel au **dĂ©but** de la variable `PATH`. Le systĂšme le trouvera **avant** de trouver tout autre Python disponible. Ainsi, lorsque vous exĂ©cutez `python`, il utilisera le Python **de l’environnement virtuel** au lieu de tout autre `python` (par exemple, un `python` d’un environnement global).
Activer un environnement virtuel change aussi deux ou trois autres choses, mais c’est l’un des points les plus importants. Activer un environnement virtuel change aussi deux ou trois autres choses, mais c’est l’un des points les plus importants.
@ -766,11 +766,11 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
//// ////
Cela signifie que le programme `python` qui sera utilisĂ© est celui dans l’environnement virtuel. Cela signifie que le programme `python` qui sera utilisĂ© est celui **dans l’environnement virtuel**.
Vous utilisez `which` sous Linux et macOS et `Get-Command` sous Windows PowerShell. Vous utilisez `which` sous Linux et macOS et `Get-Command` sous Windows PowerShell.
La façon dont cette commande fonctionne est qu’elle va vĂ©rifier la variable d’environnement `PATH`, en parcourant chaque chemin dans l’ordre, Ă  la recherche du programme nommĂ© `python`. Une fois trouvĂ©, elle vous affichera le chemin vers ce programme. La façon dont cette commande fonctionne est qu’elle va vĂ©rifier la variable d’environnement `PATH`, en parcourant **chaque chemin dans l’ordre**, Ă  la recherche du programme nommĂ© `python`. Une fois trouvĂ©, elle vous **affichera le chemin** vers ce programme.
La partie la plus importante est que lorsque vous appelez `python`, c’est exactement « `python` » qui sera exĂ©cutĂ©. La partie la plus importante est que lorsque vous appelez `python`, c’est exactement « `python` » qui sera exĂ©cutĂ©.
@ -778,9 +778,9 @@ Ainsi, vous pouvez confirmer si vous ĂȘtes dans le bon environnement virtuel.
/// tip | Astuce /// tip | Astuce
Il est facile d’activer un environnement virtuel, d’obtenir un Python, puis d’aller vers un autre projet. Il est facile d’activer un environnement virtuel, d’obtenir un Python, puis d’**aller vers un autre projet**.
Et le second projet ne fonctionnerait pas parce que vous utilisez le Python incorrect, provenant d’un environnement virtuel d’un autre projet. Et le second projet **ne fonctionnerait pas** parce que vous utilisez le **Python incorrect**, provenant d’un environnement virtuel d’un autre projet.
Il est utile de pouvoir vĂ©rifier quel `python` est utilisĂ©. đŸ€“ Il est utile de pouvoir vĂ©rifier quel `python` est utilisĂ©. đŸ€“
@ -788,9 +788,9 @@ Il est utile de pouvoir vĂ©rifier quel `python` est utilisĂ©. đŸ€“
## Pourquoi désactiver un environnement virtuel { #why-deactivate-a-virtual-environment } ## Pourquoi désactiver un environnement virtuel { #why-deactivate-a-virtual-environment }
Par exemple, vous pourriez travailler sur un projet `philosophers-stone`, activer cet environnement virtuel, installer des packages et travailler avec cet environnement. Par exemple, vous pourriez travailler sur un projet `philosophers-stone`, **activer cet environnement virtuel**, installer des packages et travailler avec cet environnement.
Puis vous souhaitez travailler sur un autre projet `prisoner-of-azkaban`. Puis vous souhaitez travailler sur **un autre projet** `prisoner-of-azkaban`.
Vous allez vers ce projet : Vous allez vers ce projet :
@ -842,23 +842,23 @@ I solemnly swear đŸș
## Alternatives { #alternatives } ## Alternatives { #alternatives }
Ceci est un guide simple pour vous lancer et vous montrer comment tout fonctionne en dessous. Ceci est un guide simple pour vous lancer et vous montrer comment tout fonctionne **en dessous**.
Il existe de nombreuses alternatives pour gérer les environnements virtuels, les dépendances de packages (requirements), les projets. Il existe de nombreuses **alternatives** pour gérer les environnements virtuels, les dépendances de packages (requirements), les projets.
Lorsque vous ĂȘtes prĂȘt et souhaitez utiliser un outil pour gĂ©rer l’ensemble du projet, les dĂ©pendances, les environnements virtuels, etc., je vous suggĂšre d’essayer [uv](https://github.com/astral-sh/uv). Lorsque vous ĂȘtes prĂȘt et souhaitez utiliser un outil pour **gĂ©rer l’ensemble du projet**, les dĂ©pendances de packages, les environnements virtuels, etc., je vous suggĂšre d’essayer [uv](https://github.com/astral-sh/uv).
`uv` peut faire beaucoup de choses, il peut : `uv` peut faire beaucoup de choses, il peut :
* Installer Python pour vous, y compris différentes versions * **Installer Python** pour vous, y compris différentes versions
* GĂ©rer l’environnement virtuel pour vos projets * GĂ©rer l’**environnement virtuel** pour vos projets
* Installer des packages * Installer des **packages**
* Gérer les dépendances de packages et leurs versions pour votre projet * Gérer les **dépendances et versions** de packages pour votre projet
* Vous assurer d’avoir un ensemble exact de packages et de versions Ă  installer, y compris leurs dĂ©pendances, afin que vous puissiez ĂȘtre certain d’exĂ©cuter votre projet en production exactement comme sur votre ordinateur pendant le dĂ©veloppement, cela s’appelle le locking * Vous assurer d’avoir un ensemble **exact** de packages et de versions Ă  installer, y compris leurs dĂ©pendances, afin que vous puissiez ĂȘtre certain d’exĂ©cuter votre projet en production exactement comme sur votre ordinateur pendant le dĂ©veloppement, cela s’appelle le **locking**
* Et bien d’autres choses * Et bien d’autres choses
## Conclusion { #conclusion } ## Conclusion { #conclusion }
Si vous avez lu et compris tout cela, vous en savez maintenant bien plus sur les environnements virtuels que beaucoup de dĂ©veloppeurs. đŸ€“ Si vous avez lu et compris tout cela, vous en savez maintenant **bien plus** sur les environnements virtuels que beaucoup de dĂ©veloppeurs. đŸ€“
ConnaĂźtre ces dĂ©tails vous sera trĂšs probablement utile Ă  l’avenir lorsque vous dĂ©boguerez quelque chose qui semble complexe, mais vous saurez comment tout fonctionne en dessous. 😎 ConnaĂźtre ces dĂ©tails vous sera trĂšs probablement utile Ă  l’avenir lorsque vous dĂ©boguerez quelque chose qui semble complexe, mais vous saurez **comment tout fonctionne en dessous**. 😎

Loading

Cancel
Save