OpenSource

FastAPI + uvicorn 구성

아르비스 2020. 9. 3. 11:20

FastAPI는 표준 Python 유형 힌트를 기반으로 Python 3.6 이상으로 API를 빌드하기위한 최신의 빠른 (고성능) 웹 프레임 워크입니다.

기존 Flask 보다 빨라 AI관련 설치해보자.

FastAPI 공식 사이트 : https://fastapi.tiangolo.com

주요기능은 다음과 같다.

  • 빠름 : NodeJS  Go 와 동등한 매우 높은 성능 (Starlette 및 Pydantic 덕분에). 사용 가능한 가장 빠른 Python 프레임 워크 중 하나입니다 .

  • 빠른 코딩 : 기능 개발 속도를 약 200 % ~ 300 % 향상시킵니다. *

  • 버그 감소 : 인간 (개발자)이 유발 한 오류의 약 40 %를 줄입니다. *
  • 직관적 : 훌륭한 편집기 지원. 모든 곳에서 완성 . 디버깅 시간이 줄어 듭니다.
  • Easy : 사용하고 배우기 쉽게 설계되었습니다. 문서를 읽는 시간이 줄어 듭니다.
  • Short : 코드 중복을 최소화합니다. 각 매개 변수 선언의 여러 기능. 더 적은 버그.
  • 견고성 : 프로덕션 준비 코드를 얻습니다. 자동 대화 형 문서.
  • 표준 기반 : API에 대한 개방형 표준을 기반으로하며 완전히 호환됩니다 : OpenAPI (이전에는 Swagger라고 함) 및 JSON 스키마 .

설치 요구사항

   Python 3.6 이상

설치

 1) fastapi 설치

$ pip install fastapi

- 가장 기본이 되는 fastapi를 먼저 설치한다

PS C:\Users\juseok.yun> pip install fastapi
Collecting fastapi
  Downloading fastapi-0.61.1-py3-none-any.whl (48 kB)
     |████████████████████████████████| 48 kB 450 kB/s
Collecting pydantic<2.0.0,>=1.0.0
  Downloading pydantic-1.6.1-py36.py37.py38-none-any.whl (99 kB)
     |████████████████████████████████| 99 kB 1.2 MB/s
Collecting starlette==0.13.6
  Downloading starlette-0.13.6-py3-none-any.whl (59 kB)
     |████████████████████████████████| 59 kB 1.2 MB/s
Installing collected packages: pydantic, starlette, fastapi
Successfully installed fastapi-0.61.1 pydantic-1.6.1 starlette-0.13.6
PS C:\Users\juseok.yun>

 2) uvicorn 설치

$ pip install uvicorn

Uvicorn 또는 Hypercorn 과 같은 프로덕션을 위해서는 ASGI 서버도 필요합니다 .

PS C:\Users\juseok.yun> pip install uvicorn
Collecting uvicorn
  Downloading uvicorn-0.11.8-py3-none-any.whl (43 kB)
     |████████████████████████████████| 43 kB 348 kB/s
Requirement already satisfied: click==7.* in d:\utils\python\python38\lib\site-packages (from uvicorn) (7.0)
Collecting websockets==8.*
  Downloading websockets-8.1-cp38-cp38-win32.whl (65 kB)
     |████████████████████████████████| 65 kB 834 kB/s
Collecting h11<0.10,>=0.8
  Downloading h11-0.9.0-py2.py3-none-any.whl (53 kB)
     |████████████████████████████████| 53 kB 620 kB/s
Installing collected packages: websockets, h11, uvicorn
  Attempting uninstall: websockets
    Found existing installation: websockets 3.3
    Uninstalling websockets-3.3:
      Successfully uninstalled websockets-3.3
ERROR: After October 2020 you may experience errors when installing or updating packages. This is because pip will change the way that it resolves dependency conflicts.

We recommend you use --use-feature=2020-resolver to test your packages with the new resolver before it becomes the default.

theia 0.9.2 requires websockets==3.3, but you'll have websockets 8.1 which is incompatible.
Successfully installed h11-0.9.0 uvicorn-0.11.8 websockets-8.1
PS C:\Users\juseok.yun>

 

실행을 위한 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}

 

fastapi + uvicorn 실행

$ uvicorn main:app --reload --host=0.0.0.0 --port=8000

- 위와 같이 명령어로 간단하게 만들어진 API 서버를 실행시킨다.

>> main : 여기서 main은 main.py의 main을 말한다

>> app : main.py안에 있는 app=FastAPI()

>> --reload : 코드 변경 시 자동으로 저장되어 재시작 됨

>> --host : 모든 접근이 가능하게 하려면 0.0.0.0을 입력한다

>> --port : 접속 원하는 포트를 지정해준다

 

서버 접속

서비스 root ('/')접속

http://localhost:8000/

두번째 url ('/items') 접속

http://localhost:8000/items/5?q=somequery

다음과 같은 API를 main.py에 만들었습니다.

  • 경로 /  에서 HTTP 요청을 수신합니다 /items/{item_id}.
  •  경로가 걸릴 GET 작업 (또한 HTTP의로 알려진 방법 ).
  • 경로 /items/{item_id} 갖는 경로 파라미터 item_id 이어야한다 int.
  • 경로 /items/{item_id} 선택이 str 쿼리 매개 변수를 q .

 

자동으로 생성되는 Swagger UI Doc

http://localhost:8000/docs

 

대체 API 문서

대체자동문서가 자동으로 표시됨.( ReDoc 제공)

http://localhost:8000/redoc

 

 

PUT(POST) 예시

 main.py에 아래 put (post) code 추가

main.py

 uvicorn 서비 실행시 --reload 옵션을 주었기 때문에 수정된 코드는 자동으로 다시 로드된다.

http://localhost:8000/docs

 

추가 Test

* async api 추가 

main.py

Jupyter notebook 을 활용한 API Test