Quand vous déclarez des paramètres dans votre fonction de chemin qui ne font pas partie des paramètres indiqués dans le chemin associé, ces paramètres sont automatiquement considérés comme des paramètres de "requête".
Ici, le paramètre q sera optionnel, et aura None comme valeur par défaut.
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.
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 editeur de texte pour détecter des erreurs dans votre code.
Vous pouvez aussi déclarer des paramètres de requête comme booléens (bool), FastAPI les convertira :
fromtypingimportUnionfromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id:str,q:Union[str,None]=None,short:bool=False):item={"item_id":item_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"This is an amazing item that has a long description"})returnitem
Avec ce code, en allant 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 considérera le paramètre short comme ayant une valeur booléenne à True. Sinon la valeur sera à False.
Vous pouvez déclarer plusieurs paramètres de chemin et paramètres de requête dans la même fonction, FastAPI saura comment les gérer.
Et vous n'avez pas besoin de les déclarer dans un ordre spécifique.
Ils seront détectés par leurs noms :
fromtypingimportUnionfromfastapiimportFastAPIapp=FastAPI()@app.get("/users/{user_id}/items/{item_id}")asyncdefread_user_item(user_id:int,item_id:str,q:Union[str,None]=None,short:bool=False):item={"item_id":item_id,"owner_id":user_id}ifq:item.update({"q":q})ifnotshort:item.update({"description":"This is an amazing item that has a long description"})returnitem
Quand vous déclarez une valeur par défaut pour un paramètre qui n'est pas un paramètre de chemin (actuellement, nous n'avons vu que les paramètres de requête), alors ce paramètre n'est pas requis.
Si vous ne voulez pas leur donner de valeur par défaut mais juste les rendre optionnels, utilisez None comme valeur par défaut.
Mais si vous voulez rendre un paramètre de requête obligatoire, vous pouvez juste ne pas y affecter de valeur par défaut :