🔧 Update docs setup with latest configs and plugins (#11953)

This commit is contained in:
Sebastián Ramírez
2024-08-05 23:48:30 -05:00
committed by GitHub
parent af1a07052a
commit 0cd844d387
643 changed files with 37193 additions and 21694 deletions

View File

@@ -8,44 +8,63 @@ Tout d'abord, sachez que vous pouvez mélanger les déclarations des paramètres
Vous pouvez également déclarer des paramètres body comme étant optionnels, en leur assignant une valeur par défaut à `None` :
=== "Python 3.10+"
//// tab | Python 3.10+
```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py310.py!}
```
```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py310.py!}
```
=== "Python 3.9+"
////
```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py39.py!}
```
//// tab | Python 3.9+
=== "Python 3.8+"
```Python hl_lines="18-20"
{!> ../../../docs_src/body_multiple_params/tutorial001_an_py39.py!}
```
```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001_an.py!}
```
////
=== "Python 3.10+ non-Annotated"
//// tab | Python 3.8+
!!! tip
Préférez utiliser la version `Annotated` si possible.
```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001_an.py!}
```
```Python hl_lines="17-19"
{!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!}
```
////
=== "Python 3.8+ non-Annotated"
//// tab | Python 3.10+ non-Annotated
!!! tip
Préférez utiliser la version `Annotated` si possible.
/// tip
```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001.py!}
```
Préférez utiliser la version `Annotated` si possible.
!!! note
Notez que, dans ce cas, le paramètre `item` provenant du `Body` est optionnel (sa valeur par défaut est `None`).
///
```Python hl_lines="17-19"
{!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="19-21"
{!> ../../../docs_src/body_multiple_params/tutorial001.py!}
```
////
/// note
Notez que, dans ce cas, le paramètre `item` provenant du `Body` est optionnel (sa valeur par défaut est `None`).
///
## Paramètres multiples du body
@@ -62,17 +81,21 @@ Dans l'exemple précédent, les opérations de routage attendaient un body JSON
Mais vous pouvez également déclarer plusieurs paramètres provenant de body, par exemple `item` et `user` simultanément :
=== "Python 3.10+"
//// tab | Python 3.10+
```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!}
```
```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!}
```
=== "Python 3.8+"
////
```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial002.py!}
```
//// tab | Python 3.8+
```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial002.py!}
```
////
Dans ce cas, **FastAPI** détectera qu'il y a plus d'un paramètre dans le body (chacun correspondant à un modèle Pydantic).
@@ -93,8 +116,11 @@ Il utilisera alors les noms des paramètres comme clés, et s'attendra à recevo
}
```
!!! note
"Notez que, bien que nous ayons déclaré le paramètre `item` de la même manière que précédemment, il est maintenant associé à la clé `item` dans le corps de la requête."`.
/// note
"Notez que, bien que nous ayons déclaré le paramètre `item` de la même manière que précédemment, il est maintenant associé à la clé `item` dans le corps de la requête."`.
///
**FastAPI** effectue la conversion de la requête de façon transparente, de sorte que les objets `item` et `user` se trouvent correctement définis.
@@ -109,41 +135,57 @@ Par exemple, en étendant le modèle précédent, vous pouvez vouloir ajouter un
Si vous le déclarez tel quel, comme c'est une valeur [scalaire](https://docs.github.com/fr/graphql/reference/scalars), **FastAPI** supposera qu'il s'agit d'un paramètre de requête (`Query`).
Mais vous pouvez indiquer à **FastAPI** de la traiter comme une variable de body en utilisant `Body` :
=== "Python 3.10+"
//// tab | Python 3.10+
```Python hl_lines="23"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!}
```
```Python hl_lines="23"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!}
```
=== "Python 3.9+"
////
```Python hl_lines="23"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!}
```
//// tab | Python 3.9+
=== "Python 3.8+"
```Python hl_lines="23"
{!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!}
```
```Python hl_lines="24"
{!> ../../../docs_src/body_multiple_params/tutorial003_an.py!}
```
////
=== "Python 3.10+ non-Annotated"
//// tab | Python 3.8+
!!! tip
Préférez utiliser la version `Annotated` si possible.
```Python hl_lines="24"
{!> ../../../docs_src/body_multiple_params/tutorial003_an.py!}
```
```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!}
```
////
=== "Python 3.8+ non-Annotated"
//// tab | Python 3.10+ non-Annotated
!!! tip
Préférez utiliser la version `Annotated` si possible.
/// tip
```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial003.py!}
```
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!}
```
////
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial003.py!}
```
////
Dans ce cas, **FastAPI** s'attendra à un body semblable à :
@@ -183,44 +225,63 @@ q: str | None = None
Par exemple :
=== "Python 3.10+"
//// tab | Python 3.10+
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py310.py!}
```
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py310.py!}
```
=== "Python 3.9+"
////
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!}
```
//// tab | Python 3.9+
=== "Python 3.8+"
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!}
```
```Python hl_lines="28"
{!> ../../../docs_src/body_multiple_params/tutorial004_an.py!}
```
////
=== "Python 3.10+ non-Annotated"
//// tab | Python 3.8+
!!! tip
Préférez utiliser la version `Annotated` si possible.
```Python hl_lines="28"
{!> ../../../docs_src/body_multiple_params/tutorial004_an.py!}
```
```Python hl_lines="25"
{!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!}
```
////
=== "Python 3.8+ non-Annotated"
//// tab | Python 3.10+ non-Annotated
!!! tip
Préférez utiliser la version `Annotated` si possible.
/// tip
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004.py!}
```
Préférez utiliser la version `Annotated` si possible.
!!! info
`Body` possède les mêmes paramètres de validation additionnels et de gestion des métadonnées que `Query` et `Path`, ainsi que d'autres que nous verrons plus tard.
///
```Python hl_lines="25"
{!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!}
```
////
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004.py!}
```
////
/// info
`Body` possède les mêmes paramètres de validation additionnels et de gestion des métadonnées que `Query` et `Path`, ainsi que d'autres que nous verrons plus tard.
///
## Inclure un paramètre imbriqué dans le body
@@ -236,41 +297,57 @@ item: Item = Body(embed=True)
Voici un exemple complet :
=== "Python 3.10+"
//// tab | Python 3.10+
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!}
```
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!}
```
=== "Python 3.9+"
////
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!}
```
//// tab | Python 3.9+
=== "Python 3.8+"
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!}
```
```Python hl_lines="18"
{!> ../../../docs_src/body_multiple_params/tutorial005_an.py!}
```
////
=== "Python 3.10+ non-Annotated"
//// tab | Python 3.8+
!!! tip
Préférez utiliser la version `Annotated` si possible.
```Python hl_lines="18"
{!> ../../../docs_src/body_multiple_params/tutorial005_an.py!}
```
```Python hl_lines="15"
{!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!}
```
////
=== "Python 3.8+ non-Annotated"
//// tab | Python 3.10+ non-Annotated
!!! tip
Préférez utiliser la version `Annotated` si possible.
/// tip
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005.py!}
```
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="15"
{!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!}
```
////
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="17"
{!> ../../../docs_src/body_multiple_params/tutorial005.py!}
```
////
Dans ce cas **FastAPI** attendra un body semblable à :

View File

@@ -8,12 +8,15 @@ Votre API aura presque toujours à envoyer un corps de **réponse**. Mais un cli
Pour déclarer un corps de **requête**, on utilise les modèles de <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> en profitant de tous leurs avantages et fonctionnalités.
!!! info
Pour envoyer de la donnée, vous devriez utiliser : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`.
/// info
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.
Pour envoyer de la donnée, vous devriez utiliser : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`.
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.
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.
///
## Importez le `BaseModel` de Pydantic
@@ -110,16 +113,19 @@ Mais vous auriez le même support de l'éditeur avec <a href="https://www.jetbra
<img src="/img/tutorial/body/image05.png">
!!! tip "Astuce"
Si vous utilisez <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> comme éditeur, vous pouvez utiliser le Plugin <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>.
/// tip | "Astuce"
Ce qui améliore le support pour les modèles Pydantic avec :
Si vous utilisez <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> comme éditeur, vous pouvez utiliser le Plugin <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a>.
* de l'auto-complétion
* des vérifications de type
* du "refactoring" (ou remaniement de code)
* de la recherche
* de l'inspection
Ce qui améliore le support pour les modèles Pydantic avec :
* de l'auto-complétion
* des vérifications de type
* du "refactoring" (ou remaniement de code)
* de la recherche
* de l'inspection
///
## Utilisez le modèle
@@ -155,10 +161,13 @@ Les paramètres de la fonction seront reconnus comme tel :
* Si le paramètre est d'un **type singulier** (comme `int`, `float`, `str`, `bool`, etc.), il sera interprété comme un paramètre de **requête**.
* Si le paramètre est déclaré comme ayant pour type un **modèle Pydantic**, il sera interprété comme faisant partie du **corps** de la requête.
!!! note
**FastAPI** saura que la valeur de `q` n'est pas requise grâce à la valeur par défaut `=None`.
/// note
Le type `Optional` dans `Optional[str]` n'est pas utilisé par **FastAPI**, mais sera utile à votre éditeur pour améliorer le support offert par ce dernier et détecter plus facilement des erreurs de type.
**FastAPI** saura que la valeur de `q` n'est pas requise grâce à la valeur par défaut `=None`.
Le type `Optional` dans `Optional[str]` n'est pas utilisé par **FastAPI**, mais sera utile à votre éditeur pour améliorer le support offert par ce dernier et détecter plus facilement des erreurs de type.
///
## Sans Pydantic

View File

@@ -74,9 +74,12 @@ Ainsi, la ligne :
ne sera pas exécutée.
!!! info
/// info
Pour plus d'informations, consultez <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">la documentation officielle de Python</a>.
///
## Exécutez votre code avec votre <abbr title="En anglais: debugger">débogueur</abbr>
Parce que vous exécutez le serveur Uvicorn directement depuis votre code, vous pouvez appeler votre programme Python (votre application FastAPI) directement depuis le <abbr title="En anglais: debugger">débogueur</abbr>.

View File

@@ -24,12 +24,15 @@ $ uvicorn main:app --reload
</div>
!!! note
La commande `uvicorn main:app` fait référence à :
/// note
* `main` : le fichier `main.py` (le module Python).
* `app` : l'objet créé dans `main.py` via la ligne `app = FastAPI()`.
* `--reload` : l'option disant à uvicorn de redémarrer le serveur à chaque changement du code. À ne pas utiliser en production !
La commande `uvicorn main:app` fait référence à :
* `main` : le fichier `main.py` (le module Python).
* `app` : l'objet créé dans `main.py` via la ligne `app = FastAPI()`.
* `--reload` : l'option disant à uvicorn de redémarrer le serveur à chaque changement du code. À ne pas utiliser en production !
///
Vous devriez voir dans la console, une ligne semblable à la suivante :
@@ -137,10 +140,13 @@ Vous pourriez aussi l'utiliser pour générer du code automatiquement, pour les
`FastAPI` est une classe Python qui fournit toutes les fonctionnalités nécessaires au lancement de votre API.
!!! note "Détails techniques"
`FastAPI` est une classe héritant directement de `Starlette`.
/// note | "Détails techniques"
Vous pouvez donc aussi utiliser toutes les fonctionnalités de <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> depuis `FastAPI`.
`FastAPI` est une classe héritant directement de `Starlette`.
Vous pouvez donc aussi utiliser toutes les fonctionnalités de <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> depuis `FastAPI`.
///
### Étape 2 : créer une "instance" `FastAPI`
@@ -200,9 +206,11 @@ https://example.com/items/foo
/items/foo
```
!!! info
Un chemin, ou "path" est aussi souvent appelé route ou "endpoint".
/// info
Un chemin, ou "path" est aussi souvent appelé route ou "endpoint".
///
#### Opération
@@ -251,16 +259,19 @@ Le `@app.get("/")` dit à **FastAPI** que la fonction en dessous est chargée de
* le chemin `/`
* en utilisant une <abbr title="une méthode GET HTTP">opération <code>get</code></abbr>
!!! info "`@décorateur` Info"
Cette syntaxe `@something` en Python est appelée un "décorateur".
/// info | "`@décorateur` Info"
Vous la mettez au dessus d'une fonction. Comme un joli chapeau décoratif (j'imagine que ce terme vient de là 🤷🏻‍♂).
Cette syntaxe `@something` en Python est appelée un "décorateur".
Un "décorateur" prend la fonction en dessous et en fait quelque chose.
Vous la mettez au dessus d'une fonction. Comme un joli chapeau décoratif (j'imagine que ce terme vient de là 🤷🏻‍♂).
Dans notre cas, ce décorateur dit à **FastAPI** que la fonction en dessous correspond au **chemin** `/` avec l'**opération** `get`.
Un "décorateur" prend la fonction en dessous et en fait quelque chose.
C'est le "**décorateur d'opération de chemin**".
Dans notre cas, ce décorateur dit à **FastAPI** que la fonction en dessous correspond au **chemin** `/` avec l'**opération** `get`.
C'est le "**décorateur d'opération de chemin**".
///
Vous pouvez aussi utiliser les autres opérations :
@@ -275,14 +286,17 @@ Tout comme celles les plus exotiques :
* `@app.patch()`
* `@app.trace()`
!!! tip "Astuce"
Vous êtes libres d'utiliser chaque opération (méthode HTTP) comme vous le désirez.
/// tip | "Astuce"
**FastAPI** n'impose pas de sens spécifique à chacune d'elle.
Vous êtes libres d'utiliser chaque opération (méthode HTTP) comme vous le désirez.
Les informations qui sont présentées ici forment une directive générale, pas des obligations.
**FastAPI** n'impose pas de sens spécifique à chacune d'elle.
Par exemple, quand l'on utilise **GraphQL**, toutes les actions sont effectuées en utilisant uniquement des opérations `POST`.
Les informations qui sont présentées ici forment une directive générale, pas des obligations.
Par exemple, quand l'on utilise **GraphQL**, toutes les actions sont effectuées en utilisant uniquement des opérations `POST`.
///
### Étape 4 : définir la **fonction de chemin**.
@@ -310,8 +324,11 @@ Vous pourriez aussi la définir comme une fonction classique plutôt qu'avec `as
{!../../../docs_src/first_steps/tutorial003.py!}
```
!!! note
Si vous ne connaissez pas la différence, allez voir la section [Concurrence : *"Vous êtes pressés ?"*](../async.md#vous-etes-presses){.internal-link target=_blank}.
/// note
Si vous ne connaissez pas la différence, allez voir la section [Concurrence : *"Vous êtes pressés ?"*](../async.md#vous-etes-presses){.internal-link target=_blank}.
///
### Étape 5 : retourner le contenu

View File

@@ -52,22 +52,25 @@ $ pip install fastapi[all]
... qui comprend également `uvicorn`, que vous pouvez utiliser comme serveur pour exécuter votre code.
!!! note
Vous pouvez également l'installer pièce par pièce.
/// note
C'est ce que vous feriez probablement une fois que vous voudrez déployer votre application en production :
Vous pouvez également l'installer pièce par pièce.
```
pip install fastapi
```
C'est ce que vous feriez probablement une fois que vous voudrez déployer votre application en production :
Installez également `uvicorn` pour qu'il fonctionne comme serveur :
```
pip install fastapi
```
```
pip install uvicorn
```
Installez également `uvicorn` pour qu'il fonctionne comme serveur :
Et la même chose pour chacune des dépendances facultatives que vous voulez utiliser.
```
pip install uvicorn
```
Et la même chose pour chacune des dépendances facultatives que vous voulez utiliser.
///
## Guide utilisateur avancé

View File

@@ -6,48 +6,67 @@ De la même façon que vous pouvez déclarer plus de validations et de métadonn
Tout d'abord, importez `Path` de `fastapi`, et importez `Annotated` :
=== "Python 3.10+"
//// tab | Python 3.10+
```Python hl_lines="1 3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
```
```Python hl_lines="1 3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
```
=== "Python 3.9+"
////
```Python hl_lines="1 3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
//// tab | Python 3.9+
=== "Python 3.8+"
```Python hl_lines="1 3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
```Python hl_lines="3-4"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
////
=== "Python 3.10+ non-Annotated"
//// tab | Python 3.8+
!!! tip
Préférez utiliser la version `Annotated` si possible.
```Python hl_lines="3-4"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
```Python hl_lines="1"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```
////
=== "Python 3.8+ non-Annotated"
//// tab | Python 3.10+ non-Annotated
!!! tip
Préférez utiliser la version `Annotated` si possible.
/// tip
```Python hl_lines="3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
Préférez utiliser la version `Annotated` si possible.
!!! info
FastAPI a ajouté le support pour `Annotated` (et a commencé à le recommander) dans la version 0.95.0.
///
Si vous avez une version plus ancienne, vous obtiendrez des erreurs en essayant d'utiliser `Annotated`.
```Python hl_lines="1"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```
Assurez-vous de [Mettre à jour la version de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} à la version 0.95.1 à minima avant d'utiliser `Annotated`.
////
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="3"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
////
/// info
FastAPI a ajouté le support pour `Annotated` (et a commencé à le recommander) dans la version 0.95.0.
Si vous avez une version plus ancienne, vous obtiendrez des erreurs en essayant d'utiliser `Annotated`.
Assurez-vous de [Mettre à jour la version de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} à la version 0.95.1 à minima avant d'utiliser `Annotated`.
///
## Déclarer des métadonnées
@@ -55,49 +74,71 @@ Vous pouvez déclarer les mêmes paramètres que pour `Query`.
Par exemple, pour déclarer une valeur de métadonnée `title` pour le paramètre de chemin `item_id`, vous pouvez écrire :
=== "Python 3.10+"
//// tab | Python 3.10+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
```
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!}
```
=== "Python 3.9+"
////
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
//// tab | Python 3.9+
=== "Python 3.8+"
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!}
```
```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
////
=== "Python 3.10+ non-Annotated"
//// tab | Python 3.8+
!!! tip
Préférez utiliser la version `Annotated` si possible.
```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!}
```
```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```
////
=== "Python 3.8+ non-Annotated"
//// tab | Python 3.10+ non-Annotated
!!! tip
Préférez utiliser la version `Annotated` si possible.
/// tip
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
Préférez utiliser la version `Annotated` si possible.
!!! note
Un paramètre de chemin est toujours requis car il doit faire partie du chemin. Même si vous l'avez déclaré avec `None` ou défini une valeur par défaut, cela ne changerait rien, il serait toujours requis.
///
```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!}
```
////
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
////
/// note
Un paramètre de chemin est toujours requis car il doit faire partie du chemin. Même si vous l'avez déclaré avec `None` ou défini une valeur par défaut, cela ne changerait rien, il serait toujours requis.
///
## Ordonnez les paramètres comme vous le souhaitez
!!! tip
Ce n'est probablement pas aussi important ou nécessaire si vous utilisez `Annotated`.
/// tip
Ce n'est probablement pas aussi important ou nécessaire si vous utilisez `Annotated`.
///
Disons que vous voulez déclarer le paramètre de requête `q` comme un `str` requis.
@@ -113,33 +154,45 @@ Cela n'a pas d'importance pour **FastAPI**. Il détectera les paramètres par le
Ainsi, vous pouvez déclarer votre fonction comme suit :
=== "Python 3.8 non-Annotated"
//// tab | Python 3.8 non-Annotated
!!! tip
Préférez utiliser la version `Annotated` si possible.
/// tip
```Python hl_lines="7"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="7"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```
////
Mais gardez à l'esprit que si vous utilisez `Annotated`, vous n'aurez pas ce problème, cela n'aura pas d'importance car vous n'utilisez pas les valeurs par défaut des paramètres de fonction pour `Query()` ou `Path()`.
=== "Python 3.9+"
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py!}
```
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py!}
```
=== "Python 3.8+"
////
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an.py!}
```
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial002_an.py!}
```
////
## Ordonnez les paramètres comme vous le souhaitez (astuces)
!!! tip
Ce n'est probablement pas aussi important ou nécessaire si vous utilisez `Annotated`.
/// tip
Ce n'est probablement pas aussi important ou nécessaire si vous utilisez `Annotated`.
///
Voici une **petite astuce** qui peut être pratique, mais vous n'en aurez pas souvent besoin.
@@ -164,17 +217,21 @@ Python ne fera rien avec ce `*`, mais il saura que tous les paramètres suivants
Gardez à l'esprit que si vous utilisez `Annotated`, comme vous n'utilisez pas les valeurs par défaut des paramètres de fonction, vous n'aurez pas ce problème, et vous n'aurez probablement pas besoin d'utiliser `*`.
=== "Python 3.9+"
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py!}
```
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py!}
```
=== "Python 3.8+"
////
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an.py!}
```
//// tab | Python 3.8+
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial003_an.py!}
```
////
## Validations numériques : supérieur ou égal
@@ -182,26 +239,35 @@ Avec `Query` et `Path` (et d'autres que vous verrez plus tard) vous pouvez décl
Ici, avec `ge=1`, `item_id` devra être un nombre entier "`g`reater than or `e`qual" à `1`.
=== "Python 3.9+"
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!}
```
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!}
```
=== "Python 3.8+"
////
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!}
```
//// tab | Python 3.8+
=== "Python 3.8+ non-Annotated"
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
////
```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
```
//// tab | Python 3.8+ non-Annotated
/// tip
Prefer to use the `Annotated` version if possible.
///
```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
```
////
## Validations numériques : supérieur ou égal et inférieur ou égal
@@ -210,26 +276,35 @@ La même chose s'applique pour :
* `gt` : `g`reater `t`han
* `le` : `l`ess than or `e`qual
=== "Python 3.9+"
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!}
```
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!}
```
=== "Python 3.8+"
////
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!}
```
//// tab | Python 3.8+
=== "Python 3.8+ non-Annotated"
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!}
```
!!! tip
Préférez utiliser la version `Annotated` si possible.
////
```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
```
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="8"
{!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!}
```
////
## Validations numériques : supérieur et inférieur ou égal
@@ -238,26 +313,35 @@ La même chose s'applique pour :
* `gt` : `g`reater `t`han
* `le` : `l`ess than or `e`qual
=== "Python 3.9+"
//// tab | Python 3.9+
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py!}
```
```Python hl_lines="10"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py!}
```
=== "Python 3.8+"
////
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an.py!}
```
//// tab | Python 3.8+
=== "Python 3.8+ non-Annotated"
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005_an.py!}
```
!!! tip
Préférez utiliser la version `Annotated` si possible.
////
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005.py!}
```
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="9"
{!> ../../../docs_src/path_params_numeric_validations/tutorial005.py!}
```
////
## Validations numériques : flottants, supérieur et inférieur
@@ -269,26 +353,35 @@ Ainsi, `0.5` serait une valeur valide. Mais `0.0` ou `0` ne le serait pas.
Et la même chose pour <abbr title="less than"><code>lt</code></abbr>.
=== "Python 3.9+"
//// tab | Python 3.9+
```Python hl_lines="13"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py!}
```
```Python hl_lines="13"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py!}
```
=== "Python 3.8+"
////
```Python hl_lines="12"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an.py!}
```
//// tab | Python 3.8+
=== "Python 3.8+ non-Annotated"
```Python hl_lines="12"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006_an.py!}
```
!!! tip
Préférez utiliser la version `Annotated` si possible.
////
```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006.py!}
```
//// tab | Python 3.8+ non-Annotated
/// tip
Préférez utiliser la version `Annotated` si possible.
///
```Python hl_lines="11"
{!> ../../../docs_src/path_params_numeric_validations/tutorial006.py!}
```
////
## Pour résumer
@@ -301,18 +394,24 @@ Et vous pouvez également déclarer des validations numériques :
* `lt` : `l`ess `t`han
* `le` : `l`ess than or `e`qual
!!! info
`Query`, `Path`, et d'autres classes que vous verrez plus tard sont des sous-classes d'une classe commune `Param`.
/// info
Tous partagent les mêmes paramètres pour des validations supplémentaires et des métadonnées que vous avez vu précédemment.
`Query`, `Path`, et d'autres classes que vous verrez plus tard sont des sous-classes d'une classe commune `Param`.
!!! note "Détails techniques"
Lorsque vous importez `Query`, `Path` et d'autres de `fastapi`, ce sont en fait des fonctions.
Tous partagent les mêmes paramètres pour des validations supplémentaires et des métadonnées que vous avez vu précédemment.
Ces dernières, lorsqu'elles sont appelées, renvoient des instances de classes du même nom.
///
Ainsi, vous importez `Query`, qui est une fonction. Et lorsque vous l'appelez, elle renvoie une instance d'une classe également nommée `Query`.
/// note | "Détails techniques"
Ces fonctions sont là (au lieu d'utiliser simplement les classes directement) pour que votre éditeur ne marque pas d'erreurs sur leurs types.
Lorsque vous importez `Query`, `Path` et d'autres de `fastapi`, ce sont en fait des fonctions.
De cette façon, vous pouvez utiliser votre éditeur et vos outils de codage habituels sans avoir à ajouter des configurations personnalisées pour ignorer ces erreurs.
Ces dernières, lorsqu'elles sont appelées, renvoient des instances de classes du même nom.
Ainsi, vous importez `Query`, qui est une fonction. Et lorsque vous l'appelez, elle renvoie une instance d'une classe également nommée `Query`.
Ces fonctions sont là (au lieu d'utiliser simplement les classes directement) pour que votre éditeur ne marque pas d'erreurs sur leurs types.
De cette façon, vous pouvez utiliser votre éditeur et vos outils de codage habituels sans avoir à ajouter des configurations personnalisées pour ignorer ces erreurs.
///

View File

@@ -28,9 +28,12 @@ Vous pouvez déclarer le type d'un paramètre de chemin dans la fonction, en uti
Ici, `item_id` est déclaré comme `int`.
!!! check "vérifier"
Ceci vous permettra d'obtenir des fonctionnalités de l'éditeur dans votre fonction, telles
que des vérifications d'erreur, de l'auto-complétion, etc.
/// check | "vérifier"
Ceci vous permettra d'obtenir des fonctionnalités de l'éditeur dans votre fonction, telles
que des vérifications d'erreur, de l'auto-complétion, etc.
///
## <abbr title="aussi appelé sérialisation, ou parfois parsing ou marshalling en anglais">Conversion</abbr> de données
@@ -40,12 +43,15 @@ Si vous exécutez cet exemple et allez sur <a href="http://127.0.0.1:8000/items/
{"item_id":3}
```
!!! check "vérifier"
Comme vous l'avez remarqué, la valeur reçue par la fonction (et renvoyée ensuite) est `3`,
en tant qu'entier (`int`) Python, pas la chaîne de caractères (`string`) `"3"`.
/// check | "vérifier"
Grâce aux déclarations de types, **FastAPI** fournit du
<abbr title="conversion de la chaîne de caractères venant de la requête HTTP en données Python">"parsing"</abbr> automatique.
Comme vous l'avez remarqué, la valeur reçue par la fonction (et renvoyée ensuite) est `3`,
en tant qu'entier (`int`) Python, pas la chaîne de caractères (`string`) `"3"`.
Grâce aux déclarations de types, **FastAPI** fournit du
<abbr title="conversion de la chaîne de caractères venant de la requête HTTP en données Python">"parsing"</abbr> automatique.
///
## Validation de données
@@ -72,12 +78,15 @@ La même erreur se produira si vous passez un nombre flottant (`float`) et non u
<a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>.
!!! check "vérifier"
Donc, avec ces mêmes déclarations de type Python, **FastAPI** vous fournit de la validation de données.
/// check | "vérifier"
Notez que l'erreur mentionne le point exact où la validation n'a pas réussi.
Donc, avec ces mêmes déclarations de type Python, **FastAPI** vous fournit de la validation de données.
Ce qui est incroyablement utile au moment de développer et débugger du code qui interagit avec votre API.
Notez que l'erreur mentionne le point exact où la validation n'a pas réussi.
Ce qui est incroyablement utile au moment de développer et débugger du code qui interagit avec votre API.
///
## Documentation
@@ -86,10 +95,13 @@ documentation générée automatiquement et interactive :
<img src="/img/tutorial/path-params/image01.png">
!!! info
À nouveau, en utilisant uniquement les déclarations de type Python, **FastAPI** vous fournit automatiquement une documentation interactive (via Swagger UI).
/// info
On voit bien dans la documentation que `item_id` est déclaré comme entier.
À nouveau, en utilisant uniquement les déclarations de type Python, **FastAPI** vous fournit automatiquement une documentation interactive (via Swagger UI).
On voit bien dans la documentation que `item_id` est déclaré comme entier.
///
## Les avantages d'avoir une documentation basée sur une norme, et la documentation alternative.
@@ -141,11 +153,17 @@ Créez ensuite des attributs de classe avec des valeurs fixes, qui seront les va
{!../../../docs_src/path_params/tutorial005.py!}
```
!!! info
<a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">Les énumérations (ou enums) sont disponibles en Python</a> depuis la version 3.4.
/// info
!!! tip "Astuce"
Pour ceux qui se demandent, "AlexNet", "ResNet", et "LeNet" sont juste des noms de <abbr title="Techniquement, des architectures de modèles">modèles</abbr> de Machine Learning.
<a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">Les énumérations (ou enums) sont disponibles en Python</a> depuis la version 3.4.
///
/// tip | "Astuce"
Pour ceux qui se demandent, "AlexNet", "ResNet", et "LeNet" sont juste des noms de <abbr title="Techniquement, des architectures de modèles">modèles</abbr> de Machine Learning.
///
### Déclarer un paramètre de chemin
@@ -181,8 +199,11 @@ Vous pouvez obtenir la valeur réel d'un membre (une chaîne de caractères ici)
{!../../../docs_src/path_params/tutorial005.py!}
```
!!! tip "Astuce"
Vous pouvez aussi accéder la valeur `"lenet"` avec `ModelName.lenet.value`.
/// tip | "Astuce"
Vous pouvez aussi accéder la valeur `"lenet"` avec `ModelName.lenet.value`.
///
#### Retourner des *membres d'énumération*
@@ -235,10 +256,13 @@ Vous pouvez donc l'utilisez comme tel :
{!../../../docs_src/path_params/tutorial004.py!}
```
!!! tip "Astuce"
Vous pourriez avoir besoin que le paramètre contienne `/home/johndoe/myfile.txt`, avec un slash au début (`/`).
/// tip | "Astuce"
Dans ce cas, l'URL serait : `/files//home/johndoe/myfile.txt`, avec un double slash (`//`) entre `files` et `home`.
Vous pourriez avoir besoin que le paramètre contienne `/home/johndoe/myfile.txt`, avec un slash au début (`/`).
Dans ce cas, l'URL serait : `/files//home/johndoe/myfile.txt`, avec un double slash (`//`) entre `files` et `home`.
///
## Récapitulatif

View File

@@ -10,10 +10,13 @@ Commençons avec cette application pour exemple :
Le paramètre de requête `q` a pour type `Union[str, None]` (ou `str | None` en Python 3.10), signifiant qu'il est de type `str` mais pourrait aussi être égal à `None`, et bien sûr, la valeur par défaut est `None`, donc **FastAPI** saura qu'il n'est pas requis.
!!! note
**FastAPI** saura que la valeur de `q` n'est pas requise grâce à la valeur par défaut `= None`.
/// note
Le `Union` dans `Union[str, None]` permettra à votre éditeur de vous offrir un meilleur support et de détecter les erreurs.
**FastAPI** saura que la valeur de `q` n'est pas requise grâce à la valeur par défaut `= None`.
Le `Union` dans `Union[str, None]` permettra à votre éditeur de vous offrir un meilleur support et de détecter les erreurs.
///
## Validation additionnelle
@@ -51,22 +54,25 @@ q: Union[str, None] = None
Mais déclare explicitement `q` comme étant un paramètre de requête.
!!! info
Gardez à l'esprit que la partie la plus importante pour rendre un paramètre optionnel est :
/// info
```Python
= None
```
Gardez à l'esprit que la partie la plus importante pour rendre un paramètre optionnel est :
ou :
```Python
= None
```
```Python
= Query(None)
```
ou :
et utilisera ce `None` pour détecter que ce paramètre de requête **n'est pas requis**.
```Python
= Query(None)
```
Le `Union[str, None]` est uniquement là pour permettre à votre éditeur un meilleur support.
et utilisera ce `None` pour détecter que ce paramètre de requête **n'est pas requis**.
Le `Union[str, None]` est uniquement là pour permettre à votre éditeur un meilleur support.
///
Ensuite, nous pouvons passer d'autres paramètres à `Query`. Dans cet exemple, le paramètre `max_length` qui s'applique aux chaînes de caractères :
@@ -112,8 +118,11 @@ Disons que vous déclarez le paramètre `q` comme ayant une longueur minimale de
{!../../../docs_src/query_params_str_validations/tutorial005.py!}
```
!!! note "Rappel"
Avoir une valeur par défaut rend le paramètre optionnel.
/// note | "Rappel"
Avoir une valeur par défaut rend le paramètre optionnel.
///
## Rendre ce paramètre requis
@@ -141,8 +150,11 @@ Donc pour déclarer une valeur comme requise tout en utilisant `Query`, il faut
{!../../../docs_src/query_params_str_validations/tutorial006.py!}
```
!!! info
Si vous n'avez jamais vu ce `...` auparavant : c'est une des constantes natives de Python <a href="https://docs.python.org/fr/3/library/constants.html#Ellipsis" class="external-link" target="_blank">appelée "Ellipsis"</a>.
/// info
Si vous n'avez jamais vu ce `...` auparavant : c'est une des constantes natives de Python <a href="https://docs.python.org/fr/3/library/constants.html#Ellipsis" class="external-link" target="_blank">appelée "Ellipsis"</a>.
///
Cela indiquera à **FastAPI** que la présence de ce paramètre est obligatoire.
@@ -175,8 +187,11 @@ Donc la réponse de cette URL serait :
}
```
!!! tip "Astuce"
Pour déclarer un paramètre de requête de type `list`, comme dans l'exemple ci-dessus, il faut explicitement utiliser `Query`, sinon cela sera interprété comme faisant partie du corps de la requête.
/// tip | "Astuce"
Pour déclarer un paramètre de requête de type `list`, comme dans l'exemple ci-dessus, il faut explicitement utiliser `Query`, sinon cela sera interprété comme faisant partie du corps de la requête.
///
La documentation sera donc mise à jour automatiquement pour autoriser plusieurs valeurs :
@@ -217,10 +232,13 @@ Il est aussi possible d'utiliser directement `list` plutôt que `List[str]` :
{!../../../docs_src/query_params_str_validations/tutorial013.py!}
```
!!! note
Dans ce cas-là, **FastAPI** ne vérifiera pas le contenu de la liste.
/// note
Par exemple, `List[int]` vérifiera (et documentera) que la liste est bien entièrement composée d'entiers. Alors qu'un simple `list` ne ferait pas cette vérification.
Dans ce cas-là, **FastAPI** ne vérifiera pas le contenu de la liste.
Par exemple, `List[int]` vérifiera (et documentera) que la liste est bien entièrement composée d'entiers. Alors qu'un simple `list` ne ferait pas cette vérification.
///
## Déclarer des métadonnées supplémentaires
@@ -228,10 +246,13 @@ On peut aussi ajouter plus d'informations sur le paramètre.
Ces informations seront incluses dans le schéma `OpenAPI` généré et utilisées par la documentation interactive ou les outils externes utilisés.
!!! note
Gardez en tête que les outils externes utilisés ne supportent pas forcément tous parfaitement OpenAPI.
/// note
Il se peut donc que certains d'entre eux n'utilisent pas toutes les métadonnées que vous avez déclarées pour le moment, bien que dans la plupart des cas, les fonctionnalités manquantes ont prévu d'être implémentées.
Gardez en tête que les outils externes utilisés ne supportent pas forcément tous parfaitement OpenAPI.
Il se peut donc que certains d'entre eux n'utilisent pas toutes les métadonnées que vous avez déclarées pour le moment, bien que dans la plupart des cas, les fonctionnalités manquantes ont prévu d'être implémentées.
///
Vous pouvez ajouter un `title` :

View File

@@ -69,14 +69,19 @@ De la même façon, vous pouvez définir des paramètres de requête comme optio
Ici, le paramètre `q` sera optionnel, et aura `None` comme valeur par défaut.
!!! check "Remarque"
On peut voir que **FastAPI** est capable de détecter que le paramètre de chemin `item_id` est un paramètre de chemin et que `q` n'en est pas un, c'est donc un paramètre de requête.
/// check | "Remarque"
!!! note
**FastAPI** saura que `q` est optionnel grâce au `=None`.
On peut voir que **FastAPI** est capable de détecter que le paramètre de chemin `item_id` est un paramètre de chemin et que `q` n'en est pas un, c'est donc un paramètre de requête.
Le `Optional` dans `Optional[str]` n'est pas utilisé par **FastAPI** (**FastAPI** n'en utilisera que la partie `str`), mais il servira tout de même à votre éditeur de texte pour détecter des erreurs dans votre code.
///
/// note
**FastAPI** saura que `q` est optionnel grâce au `=None`.
Le `Optional` dans `Optional[str]` n'est pas utilisé par **FastAPI** (**FastAPI** n'en utilisera que la partie `str`), mais il servira tout de même à votre éditeur de texte pour détecter des erreurs dans votre code.
///
## Conversion des types des paramètres de requête
@@ -194,5 +199,8 @@ Ici, on a donc 3 paramètres de requête :
* `skip`, un `int` avec comme valeur par défaut `0`.
* `limit`, un `int` optionnel.
!!! tip "Astuce"
Vous pouvez utiliser les `Enum`s de la même façon qu'avec les [Paramètres de chemin](path-params.md#valeurs-predefinies){.internal-link target=_blank}.
/// tip | "Astuce"
Vous pouvez utiliser les `Enum`s de la même façon qu'avec les [Paramètres de chemin](path-params.md#valeurs-predefinies){.internal-link target=_blank}.
///