본문 바로가기

FastAPI

순서 문제

FastAPI에는 몇 안되는 단점이 존재합니다. 바로 경로의 순서 문제입니다.

 

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/users/{user_id}")
def get_user(user_id: int):
    return {"user_id": user_id}


# 추가: 현재 유저를 반환하는 앤드포인트
@app.get("/users/me")
def get_current_user():
    return {"user_id": 123}

if __name__ == "__main__":
	uvicorn.run("main:app", reload = True)

 

다음과 같이 호출한 경우 의도한 응답이 오지만, 

http :8000/users/123

 

다음과 같은 응답을 실행할 경우, 에러가 발생합니다.

$ http :8000/users/me
HTTP/1.1 422 Unprocessable Entity
content-length: 104
content-type: application/json
date: Wed, 14 Apr 2021 14:28:16 GMT
server: uvicorn

{
    "detail": [
        {
            "loc": [
                "path",
                "user_id"
            ],
            "msg": "value is not a valid integer",
            "type": "type_error.integer"
        }
    ]
}

 

이는 경로 동작(Path operation)이 앤드포인트 순서에 따라 수행되기 때문입니다. FastAPI는 위에서 아래로 순으로 동작하기 때문에  /users/{user_id}를 먼서 수행하게 됩니다.

 

user_id는 코드상 int형을 입력을 받아야 하지만 me라는 문자형을 입력 받았기 때문에 발생하는 문제입니다.

 

따라서 제대로 동작하려면 다음과 같이 코드의 순서를 변경할 필요가 있습니다.

 

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
def get_current_user():
    return {"user_id": 123}

@app.get("/users/{user_id}")
def get_user(user_id: int):
    return {"user_id": user_id}

if __name__ == "__main__":
	uvicorn.run("main:app", reload = True)

 

 

'FastAPI' 카테고리의 다른 글

문자열 열거형의 등장  (0) 2024.01.17
FastAPI 쿼리 매개변수  (0) 2024.01.16
경로 매개변수  (0) 2024.01.15
HTTP 파이  (0) 2024.01.15
FastAPI 설치 및 Pydantic 소개  (0) 2024.01.15