이번에는 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 가 많아진다면 어떻게 관리해야할지 많은 고민을 할 필요가 있다.