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 |