En este caso, el parámetro de función q será opcional, y será None por defecto.
Consejo
También notarás que FastAPI es lo suficientemente inteligente para notar que el parámetro de ruta item_id es un parámetro de ruta y q no lo es, así que, es un parámetro de consulta.
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
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 de mayúsculas/minúsculas (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 como False.
Puedes declarar múltiples parámetros de ruta y de consulta al mismo tiempo, FastAPI sabe cuál es cuál.
Y no tienes que declararlos en ningún 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
Cuando declaras un valor por defecto para parámetros que no son de ruta (por ahora, solo hemos visto parámetros de consulta), entonces no es obligatorio.
Si no quieres añadir un valor específico sino solo hacerlo opcional, establece el valor por defecto como None.
Pero cuando quieres hacer que un parámetro de consulta sea obligatorio, puedes simplemente no declarar ningún valor por defecto: