Browse Source

🌐 Update translations for fr (update-outdated)

pull/15897/head
github-actions[bot] 3 weeks ago
parent
commit
eae7b744e2
  1. 2
      docs/fr/docs/advanced/additional-status-codes.md
  2. 2
      docs/fr/docs/advanced/advanced-dependencies.md
  3. 4
      docs/fr/docs/advanced/dataclasses.md
  4. 6
      docs/fr/docs/advanced/events.md
  5. 16
      docs/fr/docs/advanced/generate-clients.md
  6. 8
      docs/fr/docs/advanced/json-base64-bytes.md
  7. 32
      docs/fr/docs/advanced/openapi-callbacks.md
  8. 2
      docs/fr/docs/advanced/response-change-status-code.md
  9. 6
      docs/fr/docs/advanced/response-headers.md
  10. 14
      docs/fr/docs/advanced/security/oauth2-scopes.md
  11. 2
      docs/fr/docs/advanced/settings.md
  12. 8
      docs/fr/docs/advanced/stream-data.md
  13. 4
      docs/fr/docs/deployment/cloud.md
  14. 4
      docs/fr/docs/deployment/docker.md
  15. 6
      docs/fr/docs/deployment/https.md
  16. 10
      docs/fr/docs/deployment/manually.md
  17. 4
      docs/fr/docs/how-to/configure-swagger-ui.md
  18. 2
      docs/fr/docs/how-to/custom-request-and-route.md
  19. 6
      docs/fr/docs/how-to/graphql.md
  20. 18
      docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
  21. 10
      docs/fr/docs/how-to/separate-openapi-schemas.md
  22. 30
      docs/fr/docs/tutorial/bigger-applications.md
  23. 8
      docs/fr/docs/tutorial/body-nested-models.md
  24. 26
      docs/fr/docs/tutorial/body.md
  25. 20
      docs/fr/docs/tutorial/debugging.md
  26. 13
      docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md
  27. 2
      docs/fr/docs/tutorial/extra-data-types.md
  28. 46
      docs/fr/docs/tutorial/extra-models.md
  29. 32
      docs/fr/docs/tutorial/first-steps.md
  30. 4
      docs/fr/docs/tutorial/handling-errors.md
  31. 2
      docs/fr/docs/tutorial/metadata.md
  32. 8
      docs/fr/docs/tutorial/query-params-str-validations.md
  33. 3
      docs/fr/docs/tutorial/query-params.md
  34. 2
      docs/fr/docs/tutorial/request-forms.md
  35. 14
      docs/fr/docs/tutorial/schema-extra-example.md
  36. 36
      docs/fr/docs/tutorial/security/first-steps.md
  37. 2
      docs/fr/docs/tutorial/security/get-current-user.md
  38. 12
      docs/fr/docs/tutorial/security/oauth2-jwt.md
  39. 18
      docs/fr/docs/tutorial/security/simple-oauth2.md
  40. 14
      docs/fr/docs/tutorial/sql-databases.md
  41. 8
      docs/fr/docs/tutorial/static-files.md
  42. 4
      docs/fr/docs/tutorial/testing.md

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*.

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 }

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 :

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 à :

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">

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
{ {

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> |

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 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.

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).
/// ///

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">

Loading…
Cancel
Save