Cuando declaras otros parámetros de la función que no hacen parte de los parámetros de path estos se interpretan automáticamente como parámetros de "query".
En este caso el parámetro de la función q será opcional y será None por defecto.
Revisa
También puedes notar que FastAPI es lo suficientemente inteligente para darse cuenta de que el parámetro de path item_id es un parámetro de path y que q no lo es, y por lo tanto es un parámetro de query.
Nota
FastAPI sabrá que q es opcional por el = None.
El Union en Union[str, None] no es usado por FastAPI (FastAPI solo usará la parte str), pero el Union[str, None] le permitirá a tu editor ayudarte a encontrar errores en tu código.
También puedes declarar tipos bool y serán convertidos:
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. Si no, lo verá como False.
Puedes declarar múltiples parámetros de path y parámetros de query al mismo tiempo. FastAPI sabe cuál es cuál.
No los tienes que declarar en un orden específico.
Serán detectados por nombre:
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
Cuando declaras un valor por defecto para los parámetros que no son de path (por ahora solo hemos visto parámetros de query), entonces no es requerido.
Si no quieres añadir un valor específico sino solo hacerlo opcional, pon el valor por defecto como None.
Pero cuando quieres hacer que un parámetro de query sea requerido, puedes simplemente no declararle un valor por defecto: