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"}과 같은 결과를 얻을 수 있다.

Path Parameter with types

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_idint 자료형으로 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 한다.

Order Matters

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 된다.

Predefined values

path parameter로 들어오는 값이 정해진 범위 내에 있을 때, **Enum모듈**을 사용하여 해당 값들을 처리할 수 있다.