FastAPI
에서 Path Parameter 를 다루는 방법도 간단합니다.
타입이 없는 파라미터의 경우
@app.get("/items/{item_id}")
async def read_item(item_id):
return {"item_id": item_id}
타입이 있는 파라미터의 경우
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
FastAPI
에서는 타입 선언을 하면 자동으로 요청을 해당 타입으로 파싱해주고, 데이터 검증을 실시합니다. 만약 int
타입으로 선언한 함수에 str
를 전달하면
{
"detail": [
{
"loc": [
"path",
"item_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
위와 같이 에러가 난 지점과 에러를 반환하게 됩니다.
공식 문서에 따르면 모든 데이터 검증은 Pydantic에 의해 수행되며, str
, float
, int
외 다른 복잡한 데이터 타입도 가능하다고 명시되어 있습니다.
먄약 미리 정의할수 있는 path parameter 값을 쓰고 싶을 때는 파이썬 enum
하위 클래스를 만들어 사용할 수 있습니다
from enum import Enum
from fastapi import FastAPI
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
if model_name == ModelName.alexnet:
return {"model_name": model_name, "message": "Deep Learning FTW!"}
if model_name.value == "lenet":
return {"model_name": model_name, "message": "LeCNN all the images"}
return {"model_name": model_name, "message": "Have some residuals"}
str
을 상속함으로써 API 문서도 타입을 제대로 렌더링 할 수 있게 됩니다.
(str
을 상속받지 않아도 문서는 똑같은 형태로 렌더링이 되는 것으로 확인됩니다. ^^;)
실제 경로를 포함하는 path parameter를 사용하기 위해서는
@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
return {"file_path": file_path}
:path
를 이용해 path parameter가 경로와 일치해야함을 알려주어야 합니다.