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
예를 들어, title 메타데이터 값을 경로 매개변수 item_id에 선언하려면 다음과 같이 입력할 수 있습니다:
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
참고
경로 매개변수는 경로의 일부여야 하므로 언제나 필수적입니다.
즉, ...로 선언해서 필수임을 나타내는게 좋습니다.
그럼에도 None으로 선언하거나 기본값을 지정할지라도 아무 영향을 끼치지 않으며 언제나 필수입니다.
해당 매개변수에 대해 아무런 선언을 할 필요가 없으므로 Query를 정말로 써야할 필요는 없습니다.
하지만 item_id 경로 매개변수는 여전히 Path를 사용해야 합니다.
파이썬은 "기본값"이 없는 값 앞에 "기본값"이 있는 값을 입력하면 불평합니다.
그러나 매개변수들을 재정렬함으로써 기본값(쿼리 매개변수 q)이 없는 값을 처음 부분에 위치 할 수 있습니다.
FastAPI에서는 중요하지 않습니다. 이름, 타입 그리고 선언구(Query, Path 등)로 매개변수를 감지하며 순서는 신경 쓰지 않습니다.
따라서 함수를 다음과 같이 선언 할 수 있습니다:
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
Query나 아무런 기본값으로도 q 경로 매개변수를 선언하고 싶지 않지만 Path를 사용하여 경로 매개변수를 item_id 다른 순서로 선언하고 싶다면, 파이썬은 이를 위한 작고 특별한 문법이 있습니다.
*를 함수의 첫 번째 매개변수로 전달하세요.
파이썬은 *으로 아무런 행동도 하지 않지만, 따르는 매개변수들은 kwargs로도 알려진 키워드 인자(키-값 쌍)여야 함을 인지합니다. 기본값을 가지고 있지 않더라도 그렇습니다.
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
Query와 Path(나중에 볼 다른 것들도)를 사용하여 문자열 뿐만 아니라 숫자의 제약을 선언할 수 있습니다.
여기서 ge=1인 경우, item_id는 1보다 "크거나(greater) 같은(equal)" 정수형 숫자여야 합니다.
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
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
여기에서 ge뿐만 아니라 gt를 선언 할 수있는 것이 중요해집니다. 예를 들어 필요한 경우, 값이 1보다 작더라도 반드시 0보다 커야합니다.
즉, 0.5는 유효한 값입니다. 그러나 0.0 또는 0은 그렇지 않습니다.
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