Además, nota que FastAPI es lo suficientemente inteligente para notar que el parámetro de path item_id es un parámetro de path y q no lo es, por lo tanto, es un parámetro de query.
También puedes declarar tipos bool, y serán convertidos:
fromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id:str,q: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
🤓 Other versions and variants
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
En este caso, si vas a:
http://127.0.0.1:8000/items/foo?short=1
o
http://127.0.0.1:8000/items/foo?short=True
o
http://127.0.0.1:8000/items/foo?short=true
o
http://127.0.0.1:8000/items/foo?short=on
o
http://127.0.0.1:8000/items/foo?short=yes
o cualquier otra variación (mayúsculas, primera letra en mayúscula, etc.), tu función verá el parámetro short con un valor bool de True. De lo contrario, será False.
Puedes declarar múltiples parámetros de path y de query al mismo tiempo, FastAPI sabe cuál es cuál.
Y no tienes que declararlos en un orden específico.
Serán detectados por nombre:
fromfastapiimportFastAPIapp=FastAPI()@app.get("/users/{user_id}/items/{item_id}")asyncdefread_user_item(user_id:int,item_id:str,q: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
🤓 Other versions and variants
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