diff --git a/docs/fr/docs/advanced/advanced-python-types.md b/docs/fr/docs/advanced/advanced-python-types.md index 3e2d9453b6..a5dfdd7716 100644 --- a/docs/fr/docs/advanced/advanced-python-types.md +++ b/docs/fr/docs/advanced/advanced-python-types.md @@ -13,17 +13,17 @@ from typing import Union def say_hi(name: Union[str, None]): - print(f"Hi {name}!") + print(f"Hi {name}!") ``` `typing` propose également un raccourci pour déclarer que quelque chose peut être `None`, avec `Optional`. -Voici un conseil issu de mon point de vue très subjectif : +Voici un conseil issu de mon point de vue très **subjectif** : - 🚨 Évitez d'utiliser `Optional[SomeType]` - À la place ✨ **utilisez `Union[SomeType, None]`** ✨. -Les deux sont équivalents et, en interne, identiques, mais je recommande `Union` plutôt que `Optional` parce que le mot « optional » semble impliquer que la valeur est facultative, alors qu'il signifie en réalité « elle peut être `None` », même si elle n'est pas facultative et reste requise. +Les deux sont équivalents et, en interne, identiques, mais je recommande `Union` plutôt que `Optional` parce que le mot « **optional** » semble impliquer que la valeur est facultative, alors qu'il signifie en réalité « elle peut être `None` », même si elle n'est pas facultative et reste requise. Je pense que `Union[SomeType, None]` est plus explicite quant à sa signification. @@ -39,13 +39,13 @@ def say_hi(name: Optional[str]): print(f"Hey {name}!") ``` -Le paramètre `name` est défini comme `Optional[str]`, mais il n'est pas facultatif, vous ne pouvez pas appeler la fonction sans le paramètre : +Le paramètre `name` est défini comme `Optional[str]`, mais il **n'est pas facultatif**, vous ne pouvez pas appeler la fonction sans le paramètre : ```Python say_hi() # Oh non, cela lève une erreur ! 😱 ``` -Le paramètre `name` est toujours requis (pas facultatif) car il n'a pas de valeur par défaut. En revanche, `name` accepte `None` comme valeur : +Le paramètre `name` est **toujours requis** (pas *facultatif*) car il n'a pas de valeur par défaut. En revanche, `name` accepte `None` comme valeur : ```Python say_hi(name=None) # Ceci fonctionne, None est valide 🎉 diff --git a/docs/fr/docs/advanced/async-tests.md b/docs/fr/docs/advanced/async-tests.md index 13c0aeacce..cc2345b0f0 100644 --- a/docs/fr/docs/advanced/async-tests.md +++ b/docs/fr/docs/advanced/async-tests.md @@ -38,7 +38,7 @@ Le fichier `test_main.py` contiendrait les tests pour `main.py`, il pourrait mai {* ../../docs_src/async_tests/app_a_py310/test_main.py *} -## Exécuter { #run-it } +## Exécutez-le { #run-it } Vous pouvez lancer vos tests comme d'habitude via : @@ -71,7 +71,7 @@ Nous pouvons ensuite créer un `AsyncClient` avec l'application et lui envoyer d C'est l'équivalent de : ```Python -response = client.get('/') +response = client.get("/") ``` ... que nous utilisions pour faire nos requêtes avec le `TestClient`. diff --git a/docs/fr/docs/advanced/behind-a-proxy.md b/docs/fr/docs/advanced/behind-a-proxy.md index d178990f0a..db0fbbd14b 100644 --- a/docs/fr/docs/advanced/behind-a-proxy.md +++ b/docs/fr/docs/advanced/behind-a-proxy.md @@ -8,7 +8,7 @@ Ces proxies peuvent gérer les certificats HTTPS et d'autres aspects. Un **proxy** placé devant votre application définit normalement certains en-têtes à la volée avant d'envoyer les requêtes à votre **serveur**, afin d'indiquer au serveur que la requête a été **transférée** par le proxy, en lui donnant l'URL d'origine (publique), y compris le domaine, le fait qu'elle utilise HTTPS, etc. -Le programme **serveur** (par exemple **Uvicorn** via **FastAPI CLI**) est capable d'interpréter ces en‑têtes, puis de transmettre ces informations à votre application. +Le **serveur** démarré par `fastapi run` est capable d'interpréter ces en‑têtes, puis de transmettre ces informations à votre application. Mais, par sécurité, comme le serveur ne sait pas qu'il se trouve derrière un proxy de confiance, il n'interprétera pas ces en‑têtes. @@ -22,7 +22,7 @@ Les en-têtes du proxy sont : /// -### Activer les en-têtes transférés par le proxy { #enable-proxy-forwarded-headers } +### Activez les en-têtes transférés par le proxy { #enable-proxy-forwarded-headers } Vous pouvez démarrer FastAPI CLI avec l'*option de CLI* `--forwarded-allow-ips` et fournir les adresses IP à considérer comme fiables pour lire ces en‑têtes transférés. @@ -34,8 +34,6 @@ Si votre **serveur** est derrière un **proxy** de confiance et que seul le prox ```console $ uv run fastapi run --forwarded-allow-ips="*" - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -101,7 +99,7 @@ Lorsque **FastAPI CLI** est configurée avec `--forwarded-allow-ips`, elle fait Vous pouvez avoir un proxy qui ajoute un préfixe de chemin à votre application. -Dans ces cas, vous pouvez utiliser `root_path` pour configurer votre application. +Dans ces cas, vous pouvez configurer le serveur avec `fastapi run --root-path`. Le `root_path` est un mécanisme fourni par la spécification ASGI (sur laquelle FastAPI est construit, via Starlette). @@ -117,7 +115,7 @@ Même si tout votre code est écrit en supposant qu'il n'y a que `/app`. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *} -Et le proxy **« stripping »** le **préfixe de chemin** à la volée avant de transmettre la requête au serveur de l'application (probablement Uvicorn via FastAPI CLI), en gardant votre application convaincue qu'elle est servie à `/app`, afin que vous n'ayez pas à mettre à jour tout votre code pour inclure le préfixe `/api/v1`. +Et le proxy **« supprimerait »** le **préfixe de chemin** à la volée avant de transmettre la requête au serveur, en gardant votre application convaincue qu'elle est servie à `/app`, afin que vous n'ayez pas à mettre à jour tout votre code pour inclure le préfixe `/api/v1`. Jusqu'ici, tout fonctionnerait normalement. @@ -161,7 +159,7 @@ L'interface de documents doit également indiquer dans le schéma OpenAPI que ce } ``` -Dans cet exemple, le « Proxy » pourrait être quelque chose comme **Traefik**. Et le serveur serait quelque chose comme FastAPI CLI avec **Uvicorn**, exécutant votre application FastAPI. +Dans cet exemple, le « Proxy » pourrait être quelque chose comme **Traefik**. Et `fastapi run` démarrerait le serveur exécutant votre application FastAPI. ### Fournir le `root_path` { #providing-the-root-path } @@ -171,14 +169,10 @@ Pour y parvenir, vous pouvez utiliser l'option de ligne de commande `--root-path ```console $ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` -Si vous utilisez Hypercorn, il dispose également de l'option `--root-path`. - /// note | Détails techniques La spécification ASGI définit un `root_path` pour ce cas d'usage. @@ -195,14 +189,12 @@ Ici, nous l'incluons dans le message uniquement à des fins de démonstration. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *} -Ensuite, si vous démarrez Uvicorn avec : +Ensuite, si vous démarrez le serveur avec :
@@ -343,7 +343,7 @@ burgers = get_burgers(2)
Donc, si vous utilisez une bibliothèque qui vous indique que vous pouvez l'appeler avec `await`, vous devez créer les *fonctions de chemin d'accès* qui l'utilisent avec `async def`, comme dans :
```Python hl_lines="2-3"
-@app.get('/burgers')
+@app.get("/burgers")
async def read_burgers():
burgers = await get_burgers(2)
return burgers
@@ -361,7 +361,7 @@ Si vous utilisez **FastAPI**, pas besoin de vous en inquiéter, car cette « pre
Mais si vous souhaitez utiliser `async` / `await` sans FastAPI, vous pouvez également le faire.
-### Écrire votre propre code async { #write-your-own-async-code }
+### Écrivez votre propre code async { #write-your-own-async-code }
Starlette (et **FastAPI**) s’appuie sur [AnyIO](https://anyio.readthedocs.io/en/stable/), ce qui le rend compatible à la fois avec la bibliothèque standard [asyncio](https://docs.python.org/3/library/asyncio-task.html) de Python et avec [Trio](https://trio.readthedocs.io/en/stable/).
diff --git a/docs/fr/docs/features.md b/docs/fr/docs/features.md
index f63783b78c..5321e64018 100644
--- a/docs/fr/docs/features.md
+++ b/docs/fr/docs/features.md
@@ -36,6 +36,7 @@ from datetime import date
from pydantic import BaseModel
+
# Déclarez une variable comme étant une str
# et profitez de l'aide de l'éditeur dans cette fonction
def main(user_id: str):
@@ -99,7 +100,7 @@ Fini de taper des noms de clés erronés, de faire des allers-retours entre les
Des **valeurs par défaut** sensées pour tout, avec des configurations optionnelles partout. Tous les paramètres peuvent être ajustés finement pour faire ce dont vous avez besoin et définir l'API dont vous avez besoin.
-Mais par défaut, tout **« just works »**.
+Mais par défaut, tout **« fonctionne tout simplement »**.
### Validation { #validation }
diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md
index 352568afec..e43e2d7e9a 100644
--- a/docs/fr/docs/index.md
+++ b/docs/fr/docs/index.md
@@ -213,7 +213,7 @@ def read_item(item_id: int, q: str | None = None):
```
async def...async def ...fastapi dev...fastapi dev ...
@@ -36,9 +36,9 @@ Vous pouvez voir les cookies définis dans l'interface de la documentation à `/
Gardez à l'esprit que, comme les **navigateurs gèrent les cookies** de manière particulière et en arrière-plan, ils **n'autorisent pas** facilement **JavaScript** à y accéder.
-Si vous allez dans **l'interface de la documentation de l'API** à `/docs`, vous pourrez voir la **documentation** des cookies pour vos *chemins d'accès*.
+Si vous allez dans **l'interface des documents de l'API** à `/docs`, vous pourrez voir la **documentation** des cookies pour vos *chemins d'accès*.
-Mais même si vous **remplissez les données** et cliquez sur « Execute », comme l'interface de la documentation fonctionne avec **JavaScript**, les cookies ne seront pas envoyés et vous verrez un **message d'erreur** comme si vous n'aviez saisi aucune valeur.
+Mais même si vous **remplissez les données** et cliquez sur « Execute », comme l'interface des documents fonctionne avec **JavaScript**, les cookies ne seront pas envoyés et vous verrez un **message d'erreur** comme si vous n'aviez saisi aucune valeur.
///
@@ -54,9 +54,9 @@ Vous pouvez utiliser la configuration du modèle de Pydantic pour `forbid` tout
Si un client tente d'envoyer des **cookies supplémentaires**, il recevra une **réponse d'erreur**.
-Pauvres bannières de cookies, avec tous leurs efforts pour obtenir votre consentement pour que l'API pour le rejeter. 🍪
+Pauvres bannières de cookies, avec tous leurs efforts pour obtenir votre consentement pour que l'API le rejette. 🍪
-Par exemple, si le client tente d'envoyer un cookie `santa_tracker` avec la valeur `good-list-please`, il recevra une **réponse d'erreur** lui indiquant que le `santa_tracker` le cookie n'est pas autorisé :
+Par exemple, si le client tente d'envoyer un cookie `santa_tracker` avec la valeur `good-list-please`, il recevra une **réponse d'erreur** lui indiquant que le cookie `santa_tracker` n'est pas autorisé :
```json
{
@@ -71,6 +71,22 @@ Par exemple, si le client tente d'envoyer un cookie `santa_tracker` avec la vale
}
```
+## Combiner des modèles de paramètres { #combine-parameter-models }
+
+Vous pouvez combiner plusieurs modèles de paramètres de cookies avec des paramètres de cookies individuels et des dépendances. Chaque modèle est extrait et validé indépendamment, comme expliqué pour les [modèles de paramètres de requête](query-param-models.md#combine-parameter-models).
+
+La configuration `extra` de chaque modèle s'applique à tous les paramètres de cookies, y compris ceux déclarés dans d'autres modèles ou dépendances. Avec `extra="forbid"`, tout cookie en dehors de ce modèle est rejeté. Avec `extra="allow"`, ces cookies sont inclus comme champs supplémentaires du modèle.
+
+## Modèles de paramètres de cookies optionnels { #optional-cookie-parameter-models }
+
+Déclarez un modèle de paramètres de cookies avec `| None` et une valeur par défaut de `None` pour rendre le groupe optionnel.
+
+{* ../../docs_src/cookie_param_models/tutorial003_an_py310.py hl[15] *}
+
+Si ni `theme` ni `locale` ne sont envoyés, `preferences` vaut `None`. Si l'un des deux est envoyé, FastAPI valide le modèle et exige les deux champs.
+
+Les mêmes règles concernant les valeurs par défaut, les champs supplémentaires et OpenAPI s'appliquent que pour les [modèles de paramètres de requête optionnels](query-param-models.md#optional-query-parameter-models).
+
## Récapitulatif { #summary }
Vous pouvez utiliser des **modèles Pydantic** pour déclarer des **cookies** dans **FastAPI**. 😎
diff --git a/docs/fr/docs/tutorial/dependencies/sub-dependencies.md b/docs/fr/docs/tutorial/dependencies/sub-dependencies.md
index c1ba81630d..47f31586a7 100644
--- a/docs/fr/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/fr/docs/tutorial/dependencies/sub-dependencies.md
@@ -64,8 +64,10 @@ Dans un scénario avancé où vous savez que vous avez besoin que la dépendance
//// tab | Python 3.10+
-```Python hl_lines="1"
-async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]):
+```Python hl_lines="2"
+async def needy_dependency(
+ fresh_value: Annotated[str, Depends(get_value, use_cache=False)],
+):
return {"fresh_value": fresh_value}
```
diff --git a/docs/fr/docs/tutorial/extra-models.md b/docs/fr/docs/tutorial/extra-models.md
index 980e929ed5..1d1e169f97 100644
--- a/docs/fr/docs/tutorial/extra-models.md
+++ b/docs/fr/docs/tutorial/extra-models.md
@@ -54,10 +54,10 @@ nous obtiendrions un `dict` Python contenant :
```Python
{
- 'username': 'john',
- 'password': 'secret',
- 'email': 'john.doe@example.com',
- 'full_name': None,
+ "username": "john",
+ "password": "secret",
+ "email": "john.doe@example.com",
+ "full_name": None,
}
```
@@ -86,10 +86,10 @@ Ou plus exactement, en utilisant `user_dict` directement, quels que soient ses c
```Python
UserInDB(
- username = user_dict["username"],
- password = user_dict["password"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
+ username=user_dict["username"],
+ password=user_dict["password"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
)
```
@@ -124,11 +124,11 @@ UserInDB(**user_in.model_dump(), hashed_password=hashed_password)
```Python
UserInDB(
- username = user_dict["username"],
- password = user_dict["password"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- hashed_password = hashed_password,
+ username=user_dict["username"],
+ password=user_dict["password"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ hashed_password=hashed_password,
)
```
diff --git a/docs/fr/docs/tutorial/header-param-models.md b/docs/fr/docs/tutorial/header-param-models.md
index 8fc1a3d366..d810a1c613 100644
--- a/docs/fr/docs/tutorial/header-param-models.md
+++ b/docs/fr/docs/tutorial/header-param-models.md
@@ -16,17 +16,17 @@ Déclarez les **paramètres d'en-tête** dont vous avez besoin dans un **modèle
{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
-**FastAPI** extrait les données de **chaque champ** depuis les **en-têtes** de la requête et vous fournit le modèle Pydantic que vous avez défini.
+**FastAPI** **extrait** les données de **chaque champ** depuis les **en-têtes** de la requête et vous fournit le modèle Pydantic que vous avez défini.
-## Consulter la documentation { #check-the-docs }
+## Consultez les documents { #check-the-docs }
-Vous pouvez voir les en-têtes requis dans l'interface de la documentation à `/docs` :
+Vous pouvez voir les en-têtes requis dans l'interface des documents à `/docs` :
@@ -182,7 +182,7 @@ Il peut y avoir des cas où vous renvoyez quelque chose qui n'est pas un champ P
### Renvoyer directement une Response { #return-a-response-directly }
-Le cas le plus courant serait [de renvoyer directement une Response comme expliqué plus loin dans la documentation avancée](../advanced/response-directly.md).
+Le cas le plus courant serait [de renvoyer directement une Response comme expliqué plus loin dans les documents avancés](../advanced/response-directly.md).
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
@@ -266,6 +266,7 @@ comme décrit dans [les documents Pydantic](https://pydantic.dev/docs/validation
Mais si vos données ont des valeurs pour les champs du modèle avec des valeurs par défaut, comme l'article avec l'ID `bar` :
+
```Python hl_lines="3 5"
{
"name": "Bar",
@@ -274,6 +275,7 @@ Mais si vos données ont des valeurs pour les champs du modèle avec des valeurs
"tax": 20.2
}
```
+
elles seront incluses dans la réponse.
@@ -281,6 +283,7 @@ elles seront incluses dans la réponse.
Si les données ont les mêmes valeurs que les valeurs par défaut, comme l'article avec l'ID `baz` :
+
```Python hl_lines="3 5-6"
{
"name": "Baz",
@@ -290,6 +293,7 @@ Si les données ont les mêmes valeurs que les valeurs par défaut, comme l'arti
"tags": []
}
```
+
FastAPI est suffisamment intelligent (en fait, Pydantic l’est) pour comprendre que, même si `description`, `tax` et `tags` ont les mêmes valeurs que les valeurs par défaut, elles ont été définies explicitement (au lieu d'être prises depuis les valeurs par défaut).
@@ -315,7 +319,7 @@ Cela peut être utilisé comme un raccourci rapide si vous n'avez qu'un seul mod
Mais il est toujours recommandé d'utiliser les idées ci-dessus, en utilisant plusieurs classes, plutôt que ces paramètres.
-En effet, le JSON Schema généré dans l’OpenAPI de votre application (et la documentation) restera celui du modèle complet, même si vous utilisez `response_model_include` ou `response_model_exclude` pour omettre certains attributs.
+En effet, le JSON Schema généré dans l’OpenAPI de votre application (et les documents) restera celui du modèle complet, même si vous utilisez `response_model_include` ou `response_model_exclude` pour omettre certains attributs.
Cela s'applique également à `response_model_by_alias` qui fonctionne de manière similaire.
diff --git a/docs/fr/docs/tutorial/security/simple-oauth2.md b/docs/fr/docs/tutorial/security/simple-oauth2.md
index 1ee9e61ec8..f624ec9111 100644
--- a/docs/fr/docs/tutorial/security/simple-oauth2.md
+++ b/docs/fr/docs/tutorial/security/simple-oauth2.md
@@ -136,11 +136,11 @@ Ainsi, il ne pourra pas essayer d'utiliser ces mêmes mots de passe dans un autr
```Python
UserInDB(
- username = user_dict["username"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- disabled = user_dict["disabled"],
- hashed_password = user_dict["hashed_password"],
+ username=user_dict["username"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ disabled=user_dict["disabled"],
+ hashed_password=user_dict["hashed_password"],
)
```
@@ -162,7 +162,7 @@ Pour cet exemple simple, nous allons faire quelque chose de complètement non s
/// tip | Astuce
-Dans le prochain chapitre, vous verrez une véritable implémentation sécurisée, avec du hachage de mot de passe et des jetons JWT.
+Dans le prochain chapitre, vous verrez une véritable implémentation sécurisée, avec du hachage de mot de passe et des jetons JWT.
Mais pour l'instant, concentrons‑nous sur les détails spécifiques dont nous avons besoin.
@@ -286,4 +286,4 @@ En utilisant ces outils, vous pouvez rendre le système de sécurité compatible
Le seul détail manquant est qu'il n'est pas encore réellement « sécurisé ».
-Dans le prochain chapitre, vous verrez comment utiliser une bibliothèque de hachage de mot de passe sécurisée et des jetons JWT.
+Dans le prochain chapitre, vous verrez comment utiliser une bibliothèque de hachage de mot de passe sécurisée et des jetons JWT.