세로형
Recent Posts
Recent Comments
Link
11-22 00:00
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

FastAPI 라우터(router)란? FastAPI router 사용법과 예제(fastapi router example) 본문

Data Engineering 및 Infra

FastAPI 라우터(router)란? FastAPI router 사용법과 예제(fastapi router example)

이수진의 블로그 2023. 5. 25. 10:02
반응형
728x170

포스팅 개요

본 포스팅은 Python FastAPI에 대해서 정리하는 FastAPI 시리즈 포스팅 중 네 번째 글인 Python FastAPI의 라우터(router)에 대해서 알아보는 글입니다. router란 무엇이고 사용법은 어떻게 되는지 살펴봅니다.

FastAPI 포스팅은 아래와 같은 순서로 정리되어 있고, 정리할 예정입니다.

 

  1. Python FastAPI 시작하기 - FastAPI란? 설치 방법과 기본 예제(FastAPI example) (https://lsjsj92.tistory.com/648)
  2. FastAPI post 간단 예제와 비동기(Asynchronous) async 함수에 대해서 (https://lsjsj92.tistory.com/649)
  3. Python pydantic이란? Python에서 데이터 검증과 설정을 관리해보자(Feat. FastAPI) (https://lsjsj92.tistory.com/650)
  4. FastAPI router란? router 사용법과 예제(fastapi router example) (본 포스팅 )
  5. Pytorch 딥러닝(deep learning) 모델과 FastAPI를 활용한 FastAPI 예제(example)
  6. Docker와 FastAPI를 활용해 pytorch 딥러닝 모델 배포하기(deploy pytorch model using docker, fastapi)

 

해당 포스팅을 작성하면서 제가 참고한 글과 데이터는 다음과 같습니다. 

본 글에서 작성하는 모든 코드는 아래 github repository에 올려두었습니다.

 

GitHub - lsjsj92/Fast_API: fast api with machine learning

fast api with machine learning. Contribute to lsjsj92/Fast_API development by creating an account on GitHub.

github.com


포스팅 본문

본 포스팅은 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) 부터 확인해보겠습니다.

 

300x250

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를 이해하시는데 조금이나마 도움이 되시길 바랍니다.

감사합니다.

반응형
그리드형
Comments