FastAPI API Router 생성하기

이번에는 API Router 를 만들어서 연결해보려고 한다.

 

API Router 생성하기

app 이라는 디렉터리를 생성해서 users 라는 router 를 작성하기 위한 routers 폴더와 users.py 파일을 생성해준다.

전체 디렉터리 구조는 다음과 같이 되어있다.

.
├── README.md
├── app
│   ├── main.py
│   └── routers
│       └── users.py
└── requirements.txt

 

이때 주의해야할 점은 main 파일이 app 파일 안으로 들어갔기 때문에 uvicorn 을 사용해서 서버를 실행할 때
다음과 같이 main 파일의 경로를 변경해서 실행해야 한다.

uvicorn app.main:app --reload

 

users.py 파일에 이렇게 작성해주었다.

from fastapi import APIRouter

router = APIRouter()


@router.get("/users")
async def get_users():
    return [
        {
            "name": "jaynam",
            "position": "data engineer",
        },
        {
            "name": "min",
            "position": "data analytics",
        },
    ]

 

이렇게 작성하게되면 users.py 파일 안에 API Router 를 만들어서 사용자 정보를 가져오는 /users 라는 API 를 작성해보았다.

하지만 이렇게만 작성하게 되면 FastAPI 서버에서는 연결이 되어있지 않아 확인이 어렵다.

 

그래서 다음과 같이 APIRouter 를 FastAPI app 에 연결해준다.

 

API Router 연결하기

main.py 파일에서 include_router() 함수를 사용해서 users API Router 를 포함시켜주어야 한다.

from fastapi import FastAPI
from app.routers.users import router as user_router

app = FastAPI()
app.include_router(user_router)


@app.get("/")
async def root():
    return {"message": "Hello World!"}

 

포함하게 된다면 다음과 같이 API 가 추가된 것을 확인할 수 있다.

 

API tag 설정하기

OpenAPI 파일을 보면 태그가 설정되어있지 않기 때문에 default 라는 기본 태그에 포함되어서 보여준다.

 

이번에는 users API 에 user 라는 태그를 추가해보자.

태그를 추가하는 방법으로는 직접 API 에 개별적으로 추가하는 방법이 있고 API Router 에 일괄적으로 추가하는 방법이 있다.

@router.get("/users", tags=["user"])

또는

router = APIRouter(tags=["user"])

 

API Router 에서 API 마다 다르게 태그를 설정하고 싶다면 API 에 직접 설정하면 되고 동일한 목적을 가지는 API 에 일괄적으로 태그를 설정하고 싶다면 APIRouter 에 설정해주면 된다.

 

그럼 OpenAPI docs 를 확인해보면 user 라는 태그 밑에 API 가 구분되어 보여지는 것을 확인할 수 있다.

 

API prefix 설정하기

이번에는 특정 사용자의 정보를 가져오는 API 를 만들어보자.

@router.get("/users/{id}")
async def get_users(id: str):
    if id == "1":
        return {
            "name": "jaynam",
            "position": "data engineer",
        }
    else:
        return {"message": "Not found user from id"}

 

id 값이 1이면 사용자 정보를 가져오고 id 값이 없으면 사용자를 찾을 수 없다는 메시지를 보여준다.

 

여기서 지금까지 만든 API path 를 확인해보면 다음과 같다.

@router.get("/users")
@router.get("/users/{id}")

 

/usres 라는 경로가 중복해서 들어가게 된다.

이때 prefix 를 설정해서 user 와 관련된 API 를 가져올 때 /users 로 시작하도록 설정할 수 있다.

prefix 를 설정할 때 기존 API 에 설정했던 경로의 앞 부분을 제거해주는 것을 잊지 말아야 한다.

from fastapi import APIRouter

router = APIRouter(prefix="/users", tags=["user"])


@router.get("/")
async def get_users():
    return [
        {
            "name": "jaynam",
            "position": "data engineer",
        },
        {
            "name": "min",
            "position": "data analytics",
        },
    ]


@router.get("/{id}")
async def get_users(id: str):
    if id == "1":
        return {
            "name": "jaynam",
            "position": "data engineer",
        }
    else:
        return {"message": "Not found user from id"}

 

자, 이렇게 하면 prefix 를 설정해두었기 때문에 앞으로 users 라는 API Router 에 API 를 추가하게 된다면 기본적으로 /users 로 시작하게 된다.

 

 

지금까지 API Router 를 생성해서 추가하는 과정에 대해서 정리해봤다.

이와 같이 목적에 맞게 API 를 구분해서 사용할 수 있고 API 가 많아진다면 어떻게 관리해야할지 많은 고민을 할 필요가 있다.