Post

Python FastAPI 사용해보기

Python FastAPI 사용해보기

오늘은 깃허브 트랜드를 보던 도중에 알게 되었던, fastapi 라이브러리를 직접 사용해보려 합니다.

깃허브 url

https://github.com/tiangolo/fastapi

프로젝트 라이선스

1
This project is licensed under the terms of the MIT license.

MIT 라이선스로 이루어져 있습니다.

개요

FastAPI는 api를 만들기 위한 라이브러리입니다.

Python 3.6 이상에 존재하는 타입 힌트에 기반한 API 웹 프레임 워크입니다.

장점

Starlette, Pydantic 패키지 덕분에 노드나 Go언어에 기반한 라이브러리에 비슷하게 속도가 구현되있다고 합니다.

그리고 짧은 코드와 사용법이 쉽다고도 강조되어 있습니다.

요구 사항

Python 3.6+

설치

1
pip install fastapi

fastapi를 pip로 설치합니다.

1
pip install email-validator

email-validator가 설치되어있지 않으면 서버가 구동되지 않으므로 같이 설치해줍니다.

1
pip install uvicorn

서버 구동을 위한 uvicorn도 pip로 설치해줍니다.

hello world

1
2
3
4
5
6
7
8
from fastapi import FastAPI

app = FastAPI()


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

FastAPI 객체를 생성해주고, 루트 경로를 get으로 가져오기로 할 함수를 만들어줍니다.

http://127.0.0.1:8000/ 에 접속하면 {"Hello":"World"}처럼 코드의 반환 값대로 출력됩니다.

서버 구동

1
uvicorn main:app --reload

파이썬의 모듈 이름과 FastAPI 객체 이름으로 uvicorn 서버를 구동합니다.

reload 옵션을 주면 코드가 변경될 때에 자동으로 반영됩니다.

심화

1
2
3
4
5
6
7
8
from fastapi import FastAPI

app = FastAPI()


@app.get("/search/{search_id}")
def read_search(search_id: int, q: str = None):
    return {"search_id": search_id, "q": q}

Path Parameters에 의해서 search_id로 검색할 수 있습니다.

기본 값이 None으로 설정된 q는 옵션으로 검색할 수 있습니다.

http://127.0.0.1:8000/search/1?q=test 으로 접속해서 테스트할 수 있습니다.

비동기

1
2
3
4
@app.get('/')
async def read_result():
    result = await some_func()
    return result

다른 비동기 함수에 의해 결과 값을 기다려야 한다면, async def로 처리할 수 있습니다.

swagger ui

api 정보들을 사용자와 상호 작용할 수 있는 라이브러리로서 기본적으로 /docs에 접근하면 존재합니다.

http://127.0.0.1:8000/docs.

ReDoc

api 레퍼런스 문서를 생성해주는 라이브러리로서 기본적으로 /redoc에 접근하면 존재합니다.

http://127.0.0.1:8000/redoc

배포

1
uvicorn main:app --host 0.0.0.0 --port 80

uvicorn으로 호스트와 포트를 지정하여 실제 웹에 배포할 수 있습니다.

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app
1
docker build -t myimage .
1
docker run -d --name mycontainer -p 80:80 myimage

또는 uvicorn-gunicorn-fastapi를 기반으로 하는 도커 파일을 만들어서 서버를 구동할 수 있습니다.

위 코드대로 수행하면 프로젝트 폴더의 /app 폴더에 존재하는 파일들로 myimage라는 이미지를 빌드되게 됩니다.

빌드된 이미지는 mycontainer라는 이름의 컨테이너로 80 포트에서 서버가 구동되게 됩니다.

This post is licensed under CC BY 4.0 by the author.