세로형
Recent Posts
Recent Comments
Link
03-29 03:47
«   2024/03   »
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
31
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

Python FastAPI 시작하기 - FastAPI란? 설치 방법과 기본 예제(FastAPI example) Feat. ASGI, Uvicorn 본문

Data Engineering 및 Infra

Python FastAPI 시작하기 - FastAPI란? 설치 방법과 기본 예제(FastAPI example) Feat. ASGI, Uvicorn

이수진의 블로그 2023. 3. 27. 08:45

포스팅 개요

본 포스팅은 Python FastAPI에 대해서 정리하는 FastAPI 시리즈 포스팅입니다.

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

 

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

위와 같이 총 6번에 걸쳐서 FastAPI 시리즈 글을 작성할 예정이며, 본 글은 그 중 첫 번째 글인 Python FastAPI 시작하기입니다. 본 포스팅에서는 FastAPI를 설치하는 방법과 간단한 예제(example)을 살펴보겠습니다. 더불어서 Uvicorn과 ASGI에 대해서 간단히 알아보려고 합니다.

 

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

 

본 글에서 작성하는 모든 코드는 아래 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에 대해서 살펴보는 포스팅입니다. FastAPI란 무엇이고 어떻게 활용할 수 있는지 간단한 예제로 살펴보면서 중간에 Python Uvicorn에 대해서도 정리해봅니다.

 


FastAPI란?

Python FastAPI란 무엇일까요? FastAPI 공식 홈페이지에는 이렇게 설명되어 있습니다.

 

 

" FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python3.6+의 API를 빌드하기 위한 웹 프레임워크입니다 "

 

즉, FastAPI라는 것은 Python3.6+ 환경에서 API를 빌드하기 위한 web framework라는 것이고 빠르다는 것이 주된 특징입니다.

공식 홈페이지에서는 주요 특징으로 다음과 같이 정리해두었습니다. 

  • 빠르다 : NodeJS 및 Go와 대등할 정도로 매우 높은 성능 
  • 빠른 코드 작성 : 개발 속도 증가
  • 적은 버그
  • 직관적 
  • 쉽고 짧은 코드
  • 표준 기반 : OpenAPI 및 JSON 스키마

이러한 특징 때문에 Python 환경에서 API를 구현할 때 FastAPI를 활용한다는 이야기가 많이 들립니다.

제가 작성하는 포스트 시리즈 중에서는 머신러닝 혹은 딥러닝 모델을  FastAPI와 함께 연동해 배포하는 과정이 있을 예정입니다.

 

FastAPI 설치와 간단한 예제(example)

먼저, FastAPI를 설치해봅니다. 설치는 별로 어렵지 않습니다. 다만, 공식 홈페이지에서도 언급되어 있듯 Python3.6 이상만 호환이 된다는 점 참고하시면 될 것 같습니다!

 

pip install "fastapi[all]"

 

위 명령어를 사용하면 fastapi 설치에 필요한 모든 라이브러리까지 함께 설치됩니다. 만약, pip install fastapi와 같이 설치하게 된다면 uvicorn과 같은 의존성 걸리는 라이브러리를 따로 설치해주어야 합니다.

 


Python Uvicorn에 대해서

  

Python Uvicorn에 대해서 이해하려면 먼저, ASGI라는 것을 먼저 알아야 합니다. 그리고 이를 위해서 CGI, WSGI를 차례로 알아둬야 할 필요가 있죠!

  • CGI란?
    • 웹 어플리케이션 서버(WAS)에 동적인 요청이 들어 왔을 때 그것에 대한 요청을 처리하고 응답을 해줘야 합니다. 
    • 이때 서버마다, 언어마다 이 형태가 다르게 된다면 곤란해지기 때문에 어떤 공통 규약(인터페이스)를 만들어야 합니다.
    • 이 인터페이스가 Common Gateway Interface(CGI)라고 이해하시면 됩니다.
  • WSGI
    • Web Server Gateway Interface의 약자로, 파이썬에서 사용되는 개념입니다.
    • CGI의 단점(요청이 들어오면 새로운 프로세스를 생성하는 등)을 보완한 방법입니다.
    • callable object 등으로 요청을 처리합니다.
    • 역할마다 WSGI application, WSGI Middleware 등으로 세부적으로 나뉘어있기도 합니다.
  • ASGI
    • WSGI는 비동기 처리에 단점이 있다고 합니다.
    • ASGI는 이를 개선하기 위해 만들어진 비동기 서버 게이트웨이 인터페이스(Asynchronous Server Gateway Interface)입니다.
    • Uvicorn은 바로 이 ASGI에서 활용됩니다!

즉, Uvicorn은 ASGI Web Application이며 동기 또는 비동기적으로 들어오는 요청에 대해 빠르게 처리할 수 있는 능력을 가졌다고 이해하시면 될 것 같습니다.


자, 이제 다시 본문으로 돌아와서 FastAPI 설치를 완료했으니 간단하게 FastAPI를 실행해볼까요?

여기서 작성해본 코드는 공식문서에 나와있는 코드를 기반으로 약간의 응용을 하거나 한 것입니다.

자세한 것은 fastapi document를 살펴보시면 더 좋습니다.

 

 

1. FastAPI 기본 예제 - FastAPI get 구성하고 실행하기

먼저, 파이썬 파일을 하나 만들고 다음과 같이 코드를 작성해봅니다.

저는 main.py라는 이름으로 파이썬 파일을 하나 만들었고 거기에 아래와 같은 FastAPI 코드를 작성하였습니다. 

from fastapi import FastAPI

app = FastAPI()


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


@app.get("/home")
def home():
    return {"message": "home"}

이렇게 구성하면 API 서버에 구성하는 path 경로에 따라 message가 return이 되는 것을 확인할 수 있습니다. 이제 아래와 같이 fastapi 파일을 실행해보겠습니다.

반응형
uvicorn main:app --reload

제 파이썬 파일 이름이 main이므로 main:app을 uvicorn으로 실행하겠다는 의미를 가집니다. reload는 업데이트 등이 일어났을 때 reload하겠다는 의미입니다.

이렇게 실행하면 fastapi 서버가 실행되는 것입니다. 해당 로그를 보시면 "Uvicorn running on http://127.0.0.1:8000 이라고 나와있는데요. 해당 링크로 들어가보겠습니다.

저는 위 코드에서 / 경로와 /home 경로를 두었습니다. 각각의 경로는 다음과 같이 설명될 수 있습니다.

  • / 경로 : 127.0.0.1:8000
  • /home 경로 : 127.0.0.1:8000/home

Python FastAPI async def와 def에 대해서 ( fastapi async def vs def )

  

또한, fastapi에서 def 즉 함수를 async로 두는 경우도 있는데요. async를 두면 비동기로 동작이 되게 됩니다. 

그러면 def로만 하면 비동기가 되지 않을까요? 그렇지는 않습니다. 다만, await을 호출하도록 가이드를 하는 곳에서는 async 표시를 하라고 쓰여져 있습니다. 이것에 대한 설명은 다음 포스팅에서 자세히 작성하겠습니다.


 

2. FastAPI 기본 예제 - FastAPI get에 값 넘겨주기

fastapi get 함수쪽에 간단하게 값을 넘겨줄 수도 있습니다. 아래와 같이 코드를 구성해보시죠

from fastapi import FastAPI

app = FastAPI()

@app.get("/home/{name}")
def read_name(name:str):
    return {'name' : name}


@app.get("/home_err/{name}")
def read_name_err(name:int):
    return {'name' : name}

2번 예제 코드는 1번 예제 코드와 더불어서 약간 응용된 상태입니다.

/home 이라는 경로에 {name}이라는 값을 둬서 /home/값 의 형태를 받을 수 있도록 했습니다.

또한, 2개의 함수를 구성했는데요. 하나는 name을 string 형태로 받고 하나는 int 형태로 받습니다. int 형태를 받는 쪽 함수 이름은 read_name_err로써 나중에 error 처리를 할 수 있도록 해주는 함수입니다. 한 번 실행해볼까요?

 

이렇게 soojin이라는 값을 넘겨주면 return 형태로 값이 넘어오는 것을 확인할 수 있습니다.

300x250

3. FastAPI Swagger UI 확인하기

FastAPI의 주요 특징중 하나는 Swagger UI를 지원해주는 것입니다. 표준 API를 지원해주기에 가능한 것이겠죠? Swagger UI를 통해 API가 구성된 것을 한 눈에 확인할 수 있습니다.

127.0.0.1:8000/docs

 

 

위 url로 들어가게 되면 docs를 확인할 수 있습니다. 

각각의 API 값을 확장해 자세한 정보를 확인할 수도 있으며, 테스트로 값을 넣어서 그 결과값을 확인할 수도 있습니다.

 

4. FastAPI 기본 예제 응용해보기

그럼 본 포스팅의 마지막 예제로 위 1~3번 과정을 조금 응용한 예제를 살펴보겠습니다.

아래 FastAPI 코드를 참고해보세요!

'''
example from https://fastapi.tiangolo.com/tutorial/path-params/
'''
from enum import Enum

from fastapi import FastAPI


class ModelName(str, Enum):
    alexnet = "alexnet"
    resnet = "resnet"
    lenet = "lenet"


app = FastAPI()


@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
    if model_name is ModelName.alexnet:
        return {"model_name": model_name, "message": "Deep Learning FTW!"}

    if model_name.value == "lenet":
        return {"model_name": model_name, "message": "LeCNN all the images"}

    return {"model_name": model_name, "message": "Have some residuals"}

위 fastapi 코드는 get으로 /models/{model_name}을 받았을 때 model_name에 따라 return 값이 달라지게 나오도록 하는 코드입니다. 이때 model_name은 ModelName이라는 클래스로 지정된 값을 받도록 하는데요! 이것에 대한 활용 방법은 차차 알아가보도록 할 것입니다. 일단, FastAPI에서 저렇게 input을 관리할 수 있구나 이렇게 이해하시면 될 것 같아요!

즉, 만약 model_name이 alexnet이라면 Deep Learning FTW 라는 메세지가 리턴되고 lenet이라면 LeCNN all the images라는 메세지가 리턴이 됩니다. alexnet, lenet도 아니라면 Have some residuals라는 메세지가 return 됩니다. 

 

 

이렇게 결과를 확인할 수 있습니다.

또한, FastAPI docs에서도 확인할 수 있는데요. 흥미로운 것은 저렇게 input 형태를 지정해주면 Swagger UI에서 값을 선택해 테스트를 해볼 수 있다는 점입니다.

이렇게 말이죠! 저렇게 박스 형태로 나온 list들 중 원하는 값을 선택할 수 있습니다.

저렇게 선택하고 Execute를 누르면!

이렇게 결과가 나오는 것을 확인할 수 있습니다.

 


마무리

본 포스팅은 Python FastAPI 시리즈 첫 글로써 FastAPI란 무엇이고 어떻게 사용할 수 있는지 기본적인 예제(example)을 살펴보았습니다. 또한, FastAPI를 실행할 때 나오는 Uvicorn에 대해서 Uvicorn이 무엇인지, WSGI, ASGI가 무엇인지도 간단하게 살펴보았습니다.

이제 다음 포스팅에서 더 자세한 내용으로 FastAPI를 살펴보겠습니다. 

긴 글 읽어주셔서 감사합니다.

 

저에게 연락을 주시고 싶으신 것이 있으시다면

으로 연락주시면 감사하겠습니다.

반응형
그리드형
Comments