FastAPI) 경로 매개변수

나 안해·2023년 3월 27일
0

FastAPI

목록 보기
4/4
post-thumbnail

경로 매개변수?

파이썬 포맷 문자열이 사용하는 동일한 문법으로 "매개변수" 또는 "변수"를 경로에 선언할 수 있다

예시)
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}
  • 경로 매개변수 item_id의 값은 함수의 item_id 인자로 전달되서 http://127.0.0.1:8000/items/foo로 이동하면 {"item_id":"foo"}라는 응답을 볼 수 있다

타입이 있는 매개변수

위의 코드에서 파이썬 표준 타입 어노테이션을 사용하여 함수에 있는 경로 매개변수의 타입을 선언할 수도 있다.

@app.get("/items/{item_id}")
async def read_item(item_id:int):

데이터 변환

http://127.0.0.1:8000/items/3을 열면 {"item_id":3}라는 응답을 볼 수 있다

  • 이때 함수가 받은(반환도 하는) 값은 문자열 "3"이 아니라 파이썬 int 형인 3으로 타입 선언을 하면 FastAPI는 자동으로 요청을 "파싱"한다.

데이터 검증

경로의 타입을 int로 설정했으므로 브라우저에서 경로를 str 등으로 주게 되면 아래와 같은 에러가 발생한다 (이는 int와 float 사이에도 동일)

{
    "detail": [
        {
            "loc": [
                "path",
                "item_id"
            ],
            "msg": "value is not a valid integer",
            "type": "type_error.integer"
        }
    ]
}
  • 파이썬 타입 선언을 하면 FastAPI는 데이터 검증하는데 오류는 검증을 통과하지 못한 지점도 정확하게 명시한다.
    • 이는 API와 상호 작용하는 코드를 개발하고 디버깅하는 데 매우 유용

순서 문제

경로 동작을 만들때 고정 경로를 갖고 있는 상황들을 맞닦뜨릴 수 있다.
/users/me처럼, 현재 사용자의 데이터를 가져오려고 할 때, 사용자 ID를 이용해 특정 사용자의 정보를 가져오는 경로 /users/{user_id}도 있으면
경로 동작은 순차적으로 평가되기 때문에 /users/{user_id} 이전에 /users/me를 먼저 선언해야 한다.

from fastapi import FastAPI

app = FastAPI()


@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}

그렇지 않으면 /users/{user_id}는 매개변수 user_id의 값을 "me"라고 "생각하여" /users/me도 연결한다.

사전정의 값부터 정리 다시

0개의 댓글