Do mesmo modo que você pode declarar mais validações e metadados para parâmetros de consulta com Query, você pode declarar os mesmos tipos de validações e metadados para parâmetros de rota com Path.
fromfastapiimportFastAPI,Path,Queryapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(item_id:int=Path(title="The ID of the item to get"),q:str|None=Query(default=None,alias="item-query"),):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
fromtypingimportUnionfromfastapiimportFastAPI,Path,Queryapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(item_id:int=Path(title="The ID of the item to get"),q:Union[str,None]=Query(default=None,alias="item-query"),):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
Você pode declarar todos os parâmetros da mesma maneira que na Query.
Por exemplo para declarar um valor de metadado title para o parâmetro de rota item_id você pode digitar:
fromfastapiimportFastAPI,Path,Queryapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(item_id:int=Path(title="The ID of the item to get"),q:str|None=Query(default=None,alias="item-query"),):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
fromtypingimportUnionfromfastapiimportFastAPI,Path,Queryapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(item_id:int=Path(title="The ID of the item to get"),q:Union[str,None]=Query(default=None,alias="item-query"),):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
Nota
Um parâmetro de rota é sempre obrigatório, como se fizesse parte da rota.
Então, você deve declará-lo com ... para marcá-lo como obrigatório.
Mesmo que você declare-o como None ou defina um valor padrão, isso não teria efeito algum, o parâmetro ainda seria obrigatório.
Ordene os parâmetros de acordo com sua necessidade¶
Suponha que você queira declarar o parâmetro de consulta q como uma str obrigatória.
E você não precisa declarar mais nada em relação a este parâmetro, então você não precisa necessariamente usar Query.
Mas você ainda precisa usar Path para o parâmetro de rota item_id.
O Python irá acusar se você colocar um elemento com um valor padrão definido antes de outro que não tenha um valor padrão.
Mas você pode reordená-los, colocando primeiro o elemento sem o valor padrão (o parâmetro de consulta q).
Isso não faz diferença para o FastAPI. Ele vai detectar os parâmetros pelos seus nomes, tipos e definições padrão (Query, Path, etc), sem se importar com a ordem.
Então, você pode declarar sua função assim:
fromfastapiimportFastAPI,Pathapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(q:str,item_id:int=Path(title="The ID of the item to get")):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
Ordene os parâmetros de a acordo com sua necessidade, truques¶
Se você quiser declarar o parâmetro de consulta q sem um Query nem um valor padrão, e o parâmetro de rota item_id usando Path, e definí-los em uma ordem diferente, Python tem um pequeno truque na sintaxe para isso.
Passe *, como o primeiro parâmetro da função.
O Python não vai fazer nada com esse *, mas ele vai saber que a partir dali os parâmetros seguintes deverão ser chamados argumentos nomeados (pares chave-valor), também conhecidos como kwargs. Mesmo que eles não possuam um valor padrão.
fromfastapiimportFastAPI,Pathapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(*,item_id:int=Path(title="The ID of the item to get"),q:str):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
Com Query e Path (e outras que você verá mais tarde) você pode declarar restrições numéricas.
Aqui, com ge=1, item_id precisará ser um número inteiro maior que ("greater than") ou igual ("equal") a 1.
fromfastapiimportFastAPI,Pathapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(*,item_id:int=Path(title="The ID of the item to get",ge=1),q:str):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
Validações numéricas: maior que e menor que ou igual¶
O mesmo se aplica para:
gt: maior que (greater than)
le: menor que ou igual (less than or equal)
fromfastapiimportFastAPI,Pathapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(*,item_id:int=Path(title="The ID of the item to get",gt=0,le=1000),q:str,):results={"item_id":item_id}ifq:results.update({"q":q})returnresults
Validações numéricas: valores do tipo float, maior que e menor que¶
Validações numéricas também funcionam para valores do tipo float.
Aqui é onde se torna importante a possibilidade de declarar gt e não apenas ge. Com isso você pode especificar, por exemplo, que um valor deve ser maior que 0, ainda que seja menor que 1.
Assim, 0.5 seria um valor válido. Mas 0.0 ou 0 não seria.
E o mesmo para lt.
fromfastapiimportFastAPI,Path,Queryapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_items(*,item_id:int=Path(title="The ID of the item to get",ge=0,le=1000),q:str,size:float=Query(gt=0,lt=10.5),):results={"item_id":item_id}ifq:results.update({"q":q})returnresults