FastAPI - First step

SeungHyuk Shin·2021년 4월 16일
0
post-thumbnail

1. 들어가며


알고리즘으로 파이썬으로 풀며 파이썬과 점점 친해지다보니 자연스럽게 파이썬 웹프레임워크에도 관심을 갖게 되었다. 기존의 파이썬의 웹프레임워크는 크게 Django와 Flask가 있는데 최근에 나온 FastAPI가 두 프레임워크의 성능을 압도적으로 능가하는 모습을 보여주고 있다.

NodeJS에는 아직 못미치지만 다른 두 프레임워크를 압도하는 퍼포먼스를 보여준다. 성능이 더 좋은게 있다면 안쓸 이유가 없다. 이 엄청낭 성능의 뒤에는 웹 쪽에는 starlette 데이터 쪽에는 pydantic가 있다. srarlette는 ASGI(Asynchronous Server Gateway Interface) 프레임워크/툴킷이고 paydanitc은 파이썬 타입의 어토네이션을 사용해서 데이터를 검증 해주는 것이라고 한다. ASGI는 별도의 포스트를 통해 무엇인지 다루도록 해야겠다.


출처

또한 이 뿐만 아니라 프로덕션을 위한 Uvicon 또는 Hypercorn과 같은 초고속 ASGI 서버가 필요하다.

Uvicorn은 ASGI 서버 구현체이며, Uvloophttptools를 사용한다.최근까지 파이썬은 비동기 프레임워크를 위한 love-level 서버/애플리케이션 인터페이스가 부족했다. ASGI 사양은 이러한 격차를 해소하고 Uvicorn은 등장으로 이제 모든 비동기 프레임워크에서 사용할 수 있는 공통 툴셋을 구축할 수 있게 되었다.

Uvloop은 NodeJS를 현재의 위치까지 올려주는데 도움을 준 libuv를 기반으로 Cython으로 작성되었다고 한다. libuv를 잘 설명한 글을 링크로 대체 하겠다. httptools는 NodeJS의 http parser의 파이썬 버전이라고 한다. 새삼 NodeJS의 대단함을 느끼게 된다.

한줄로 정리하자면 FastAPI는 Wrapper라고 볼 수 있다

2.설치 및 예제 실행


FastAPI에 대해 간략하게 알아보았으니 이제 직접 설치를 해보고 예제 프로젝트를 만들어보자. 우선 파이썬 3.6+가 설치되어 있어야한다.

pip install fastapi #fastapi 설치
pip install uvicorn[standard] #uvicorn 설치

이후 다음과 같이 main.py를 만든다.

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

이제 다음 명령어를 입력해서 앱을 구동해보자.

uvicorn main:app --reload

# 명령 uvicorn main:app --reload은 다음을 나타낸다:
# main: main.py 파일 (파이썬 모듈이름).
# app: 모듈안에 생성된 app이라는 이름의 오브젝트를 가져온다. 현재 여기서는 app = FastAPI()
# --reload: 코드가 변경된 후 서버 재시작하기. 개발환경에서만 사용해야한다

그럼 이제 실제로 앱이 구동하는지 확인해보자. 브라우저로 http://127.0.0.1:8000/items/5?q=somequery 주소로 접속해본다.

다음과 같은 Json이 잘 출력이된다. 우린 벌써 API를 하나 만든거다.

그리고 http://127.0.0.1:8000/docs에 접속해보면 Swagger UI를 통해 우리가 만든 API를 아름답게 문서화해서 정리해주는 화면을 볼 수 있다.

이제 put 메소드를 이용해 body를 받기위해 main.py를 수정해보자. Pydantic을 이용해 파이썬 표준 타입으로 본문을 선언한다.

from typing import Optional
from pydantic import BaseModel

from fastapi import FastAPI

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

이후 저장하면 자동으로 바뀐 내용이 reload된다. 다시 http://127.0.0.1:8000/docs에 접속해보면 api가 하나 더 생성되었다.

여기서 try it out를 눌러 변수를 설정해주고 excute 버튼을 누르면 사용자 인터페이스는 API와 통신하고 매개변수를 전송하며 그 결과를 가져와서 화면에 표시한다. API를 확인하기 위해 별도의 외부 프로그램이 필요가 없다.

3. 마치며


FastAPI를 처음으로 써보았는데 정말 간단하고 쉽게 서버가 구성되었다. 또한 공식문서 예제가 친절하게 작성되어있어서 배우는데에 큰 문제가 없을 것같다.

0개의 댓글