Fast API 에서는 Flask에서 하던 것과 같이 Path Parameter를 설정할 수 있다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id):
return {"item_id": item_id}
위와 같이 선언을 하고 난 뒤, http://127.0.0.1:8000/items/item1 으로 url을 입력해보면 {"item_id":"item1"}
과 같은 결과를 얻을 수 있다.
Fast API의 장점인 Type Hinting을 사용하여 위의 코드를 바꿔보자
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
이로 인해 item_id
는 int
자료형으로 Parsing이 되며, 아까와 같이 item1이라는 값을 넘기면 error log를 보여준다.
{
"detail":[
{
"loc":[
"path",
"item_id"
],
"msg":"value is not a valid integer",
"type":"type_error.integer"
}
]
}
http://127.0.0.1:8000/items/1 로 url를 다시 요청을 보내면 {"item_id":1}
과 같은 결과를 return 한다.
path를 정의할 때, 순서가 중요하다.
만약 /users/me
요청을 보낸다고 가정해보자. 그런데 /users/{user_id}
의 path또한 있을 때, 정의된 순서에 따라 return 되는 결과 값이 달라진다.
@app.get("/users/me")
async def read_user_me():
return {"user_id": "the current user"}
@app.get("/users/{user_id}")
async def read_user(user_id: str):
return {"user_id": user_id}
위와 같은 순서로 정의가 되어있다면, read_user_me
를 먼저 마주치기에 {"user_id": "the current user"}
의 결과가 return된다.
만약 read_user
path가 먼저 위에 정의가 되어있었다면, {"user_id": "me"}
의 결과가 return 된다.
path parameter로 들어오는 값이 정해진 범위 내에 있을 때, Enum
모듈을 사용하여 해당 값들을 처리할 수 있다.