포스팅 개요
본 포스팅은 Python FastAPI에 대해서 정리하는 FastAPI 시리즈 포스팅 중 네 번째 글인 Python FastAPI의 라우터(router)에 대해서 알아보는 글입니다. router란 무엇이고 사용법은 어떻게 되는지 살펴봅니다.
FastAPI 포스팅은 아래와 같은 순서로 정리되어 있고, 정리할 예정입니다.
- Python FastAPI 시작하기 - FastAPI란? 설치 방법과 기본 예제(FastAPI example) (https://lsjsj92.tistory.com/648)
- FastAPI post 간단 예제와 비동기(Asynchronous) async 함수에 대해서 (https://lsjsj92.tistory.com/649)
- Python pydantic이란? Python에서 데이터 검증과 설정을 관리해보자(Feat. FastAPI) (https://lsjsj92.tistory.com/650)
- FastAPI router란? router 사용법과 예제(fastapi router example) (본 포스팅 )
- Pytorch 딥러닝(deep learning) 모델과 FastAPI를 활용한 FastAPI 예제(example)
- Docker와 FastAPI를 활용해 pytorch 딥러닝 모델 배포하기(deploy pytorch model using docker, fastapi)
해당 포스팅을 작성하면서 제가 참고한 글과 데이터는 다음과 같습니다.
- https://fastapi.tiangolo.com/
- https://github.com/tiangolo/fastapi
- https://fastapi.tiangolo.com/tutorial/bigger-applications/
본 글에서 작성하는 모든 코드는 아래 github repository에 올려두었습니다.
포스팅 본문
본 포스팅은 Python FastAPI의 router에 대해서 살펴보는 글입니다. FastAPI router란 무엇이며, 그 활용 방법이 어떻게 되는지 예제(example)을 통해서 살펴보겠습니다.
FastAPI router란?
FastAPI에서 라우터(router)라는 것은 일종의 sub fastapi application과 같은 느낌입니다. 하나의 파일을 통해 모든 것을 구성하는 것이 아니라, 각 특성에 맞는 코드와 파일을 분리하고 이를 조합해 더 큰 application을 만들게 도와주는 구조입니다.
즉 "특성에 맞는 path operation을 생성하고 이들을 조합해서 더 큰 application을 구성한다. "라고 이해하시면 될 것 같습니다.
FastAPI router 사용법 및 예제
그러면 FastAPI router를 이해하기 위해 예제를 통해 살펴보겠습니다.
먼저, 아래와 같이 총 3개의 코드를 구현해뒀다고 가정합니다.
1. routers/ncf.py
routers안에 있는 ncf.py는 추천 시스템 모델 중 ncf(neural collaborative filtering) 모델을 핸들링하는 파일이라고 가정합니다. ncf.py에는 APIrouter라는 모듈을 활용해 router를 구성하고 있습니다. 코드 내용은 다음과 같습니다.
from fastapi import APIRouter
ncf = APIRouter(prefix='/ncf')
@ncf.get('/', tags=['ncf'])
async def start_ncf():
return {'msg' : 'Here is NCF'}
@ncf.get('/model', tags=['ncf'])
async def ncf_model():
return {'msg' : 'Here is NCF model'}
코드를 보시면 from fastapi import APIRouter를 통해 Router 모듈을 가지고 옵니다. 이때, 마치 app = FastAPI() 과 같은 형태로 ncf = APIRouter()로 object를 생성할 수 있습니다. 여기 router에서는 prefix라는 것을 지정할 수 있는데요. 본 코드에서는 prefix를 ncf로 지정하였는데, 이렇게 지정을 해두면 ncf로 타고 들어오는 경로는 해당 FastAPI 라우터에서 잡히게 됩니다.
예시를 들어보겠습니다. 만약, 127.0.0.1:8081로 FastAPI를 실행하였다고 하겠습니다.
- 127.0.0.1:8081은 main 경로
- 127.0.0.1:8081/ncf 는 ncf router를 타게 되고 이는 start_ncf 함수와 통신
- 127.0.0.1:8081/ncf/model은 ncf router를 타게 되고 이는 ncf_model 함수와 통신
와 같이 되는 것입니다.
2. routers/nfm.py
routers안에 있는 nfm.py는 추천 시스템 모델 중 nfm(neural factorization machine) 모델을 핸들링하는 파일이라고 가정합니다. nfm.py에는 ncf와 마찬가지로 APIrouter라는 모듈을 활용해 router를 구성하고 있습니다. nfm.py 코드 내용은 다음과 같습니다.
from fastapi import APIRouter
nfm = APIRouter(prefix='/nfm')
@nfm.get('/', tags=['nfm'])
async def start_nfm():
return {'msg' : 'Here is NFM'}
@nfm.get('/model', tags=['nfm'])
async def nfm_model():
return {'msg' : 'Here is NFM model'}
nfm router에서는 ncf와 마찬가지의 프로세스를 거치게 됩니다. FastAPI 라우터를 설정해주고 prefix 값을 nfm으로 설정합니다. 여기서도 아래와 같이 프로세스를 타게 됩니다.
- 127.0.0.1:8081은 main 경로
- 127.0.0.1:8081/nfm 는 nfm router를 타게 되고 이는 start_nfm 함수와 통신
- 127.0.0.1:8081/nfm/model은 nfm router를 타게 되고 이는 nfm_model 함수와 통신
3. router_example.py
이제 위 router와 연동하는 main을 살펴보겠습니다. main은 router_example.py이며, 해당 코드는 다음과 같습니다.
from fastapi import FastAPI
from routers.ncf import ncf
from routers.nfm import nfm
import uvicorn
app = FastAPI()
app.include_router(ncf)
app.include_router(nfm)
@app.get('/')
def home():
return {'msg' : 'Main'}
if __name__ == "__main__":
uvicorn.run("router_example:app", host='0.0.0.0', port=8000, reload=True)
router_exmple.py는 FastAPI router를 활용 예제의 main 파일입니다. 여기서의 핵심은 위 1번, 2번에서 만든 코드에서 각각 router 변수를 from routers.nfm import ncf 형태로 가져온다는 것입니다.
또한, app = FastAPI() 식으로 만든 FastAPI 객체에 app.include_router를 통해 router를 추가해줍니다. 이때 저는 위에서 만든 ncf, nfm router 값을 각각 추가해줬습니다.
자, 그럼 아래와 같이 실행해겠습니다.
uvicorn router_example:app --port 8081 --reload
이렇게 실행하면 router_exmaple.py를 main처럼 사용할 수 있습니다. 이제 각각 경로를 봐보면서 실행 결과를 확인해봅시다.
먼저, FastAPI Swagger UI (docs) 부터 확인해보겠습니다.
FastAPI docs를 확인하면 (본 코드에서는 http://127.0.0.1:8081/docs) default로 지정된 / 경로 외에도 ncf, nfm의 2개의 값이 생긴 것을 확인할 수 있습니다. 저 두 개의 결과는 router의 영향으로 만들어진 path 정보입니다.
또한, 각각의 http://127.0.0.1:8081/ncf http://127.0.0.1:8081/ncf/model 등의 path로 이동하면 지정한 결과가 나오는 것을 확인할 수 있습니다.
이처럼, FastAPI router는 각 특성에 맞는 sub fastapi를 구현한다고 보시면 될 것 같습니다.
마무리
이번 포스팅은 Python FastAPI의 라우터(router)에 대해서 알아보았습니다. FastAPI router를 이해하시는데 조금이나마 도움이 되시길 바랍니다.
감사합니다.