5.3 KiB
Paramètres de requête
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 ».
{* ../../docs_src/query_params/tutorial001_py39.py hl[9] *}
La query est l'ensemble des paires clé-valeur placées après le ? dans une URL, séparées par des caractères &.
Par exemple, dans l'URL :
http://127.0.0.1:8000/items/?skip=0&limit=10
... les paramètres de requête sont :
skip: avec une valeur de0limit: avec une valeur de10
Comme ils font partie de l'URL, ce sont « naturellement » des chaînes de caractères.
Mais lorsque vous les déclarez avec des types Python (dans l'exemple ci-dessus, en tant que int), ils sont convertis vers ce type et validés par rapport à celui-ci.
Tous les mêmes processus qui s'appliquaient aux paramètres de chemin s'appliquent aussi aux paramètres de requête :
- Prise en charge de l'éditeur (évidemment)
- « parsing » des données
- Validation des données
- Documentation automatique
Valeurs par défaut
Comme les paramètres de requête ne sont pas une partie fixe d'un chemin, ils peuvent être optionnels et avoir des valeurs par défaut.
Dans l'exemple ci-dessus, ils ont des valeurs par défaut skip=0 et limit=10.
Donc, accéder à l'URL :
http://127.0.0.1:8000/items/
serait équivalent à accéder à :
http://127.0.0.1:8000/items/?skip=0&limit=10
Mais si vous accédez, par exemple, à :
http://127.0.0.1:8000/items/?skip=20
Les valeurs des paramètres dans votre fonction seront :
skip=20: car vous l'avez défini dans l'URLlimit=10: car c'était la valeur par défaut
Paramètres optionnels
De la même façon, vous pouvez déclarer des paramètres de requête optionnels, en définissant leur valeur par défaut à None :
{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
Dans ce cas, le paramètre de fonction q sera optionnel et vaudra None par défaut.
/// check | Vérifications
Notez également que FastAPI est suffisamment intelligent pour remarquer que le paramètre de chemin item_id est un paramètre de chemin et que q ne l'est pas, c'est donc un paramètre de requête.
///
Conversion des types des paramètres de requête
Vous pouvez aussi déclarer des types bool, ils seront convertis :
{* ../../docs_src/query_params/tutorial003_py310.py hl[7] *}
Dans ce cas, si vous allez sur :
http://127.0.0.1:8000/items/foo?short=1
ou
http://127.0.0.1:8000/items/foo?short=True
ou
http://127.0.0.1:8000/items/foo?short=true
ou
http://127.0.0.1:8000/items/foo?short=on
ou
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.
Multiples paramètres de chemin et de requête
Vous pouvez déclarer plusieurs paramètres de chemin et paramètres de requête en même temps, FastAPI sait lequel est lequel.
Et vous n'avez pas besoin de les déclarer dans un ordre spécifique.
Ils seront détectés par leur nom :
{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
Paramètres de requête requis
Quand vous déclarez une valeur par défaut pour des paramètres qui ne sont pas des paramètres de chemin (pour l'instant, nous n'avons vu que les paramètres de requête), alors ils ne sont pas requis.
Si vous ne voulez pas leur donner de valeur spécifique mais simplement les rendre optionnels, définissez la valeur par défaut à None.
Mais si vous voulez rendre un paramètre de requête obligatoire, vous pouvez simplement ne déclarer aucune valeur par défaut :
{* ../../docs_src/query_params/tutorial005_py39.py hl[6:7] *}
Ici, le paramètre de requête needy est un paramètre de requête requis de type str.
Si vous ouvrez dans votre navigateur une URL comme :
http://127.0.0.1:8000/items/foo-item
... sans ajouter le paramètre requis needy, vous verrez une erreur comme :
{
"detail": [
{
"type": "missing",
"loc": [
"query",
"needy"
],
"msg": "Field required",
"input": null
}
]
}
Comme needy est un paramètre requis, vous devez le définir dans l'URL :
http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
... cela fonctionnerait :
{
"item_id": "foo-item",
"needy": "sooooneedy"
}
Et bien sûr, vous pouvez définir certains paramètres comme requis, certains avec une valeur par défaut et certains entièrement optionnels :
{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
Dans ce cas, il y a 3 paramètres de requête :
needy, unstrrequis.skip, unintavec une valeur par défaut de0.limit, unintoptionnel.
/// tip | Astuce
Vous pourriez aussi utiliser des Enums de la même façon qu'avec les Paramètres de chemin{.internal-link target=_blank}.
///