파이썬 버전 확인

FastAPI는 모던 파이썬(3.6+)만을 지원하므로 3.6 이상의 파이썬이 반드시 설치되어 있어야 한다.

(fastapi) PS D:\workspace> python -V
Python 3.8.8

가상환경 설정

python의 venv 라는 모듈을 사용해 가상환경 생성해보자.

PS D:\workspace> python -m venv fastapi 
PS D:\workspace> .\fastapi\Scripts\activate

.\fastapi\Scripts\activate : 이 시스템에서 스크립트를 실행할 수 없으므로 D:\ 
workspace\fastapi\Scripts\Activate.ps1 파일을 로드할 수 없습니다. 자세한 내  
용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170 
)를 참조하십시오.
위치 줄:1 문자:1
+ .\fastapi\Scripts\activate
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + FullyQualifiedErrorId : UnauthorizedAccess

위의 오류 뜨면 powershell 관리자 권한으로 실행

PS C:\Users\KBS> Set-ExecutionPolicy Unrestricted

image

보안설정을 해제 후 가상환경으로 잘 진입한 것을 확인할 수 있다.

PS D:\workspace> fastapi\Scripts\activate
(fastapi) PS D:\workspace>

환경에 설치된 패키지 확인 -> 새로운 환경이라 아무것도 없음

(fastapi) PS D:\workspace> pip list
Package    Version
---------- -------
pip        20.2.3
setuptools 49.2.1

fastapi 설치

(fastapi) PS D:\workspace> pip install fastapi

FASTAPI 코드 실행

FastAPI()를 호출하여 앱을 인스턴스화 하고 데코레이터를 이용해 앤드포인트를 만든다.

그런데 실행은 어떻게 해야 할까?

  • Django: python manage.py runserver
  • Flask: python main.py 또는 flask run
  • FastAPI: uvicorn main:app --reload

Django와 Flask는 각 프레임워크마다 개발용 서버를 내장하고 있기 때문에 위 처럼 앱을 실행할 수 있었다. 그래서 많은 초보 개발자들이 개발용 서버를 상용 배포를 하는 실수를 저질렀고, 이 때문에 내장서버, 웹서버(nginx, apache etc), WAS를 구별하지 못하는 개발자들이 생겼다. 그래서 FastAPI는 개발 서버를 과감히 뺐다.

따라서 FastAPI 앱을 서버를 이용해 실행하려면 Uvicorn을 설치해야 한다.

(fastapi) PS D:\workspace> pip install uvicorn

매번 uvicorn main:app --reload를 입력하기 귀찮다.

import uvicorn

from fastapi import FastAPI

app = FastAPI()  # fastapi app 인스턴스화 

@app.get("/")  # GET / 를 호출할 수 있는 엔드포인트
def hello():  # 함수명
    return "Hello, World!"  # 반환

if __name__ == '__main__':
    uvicorn.run('main:app', reload=True)
  • main: main.py 파일을 가리킨다.
  • app: main.py 에서 app을 가리킨다.
  • --reload: 파일에 변화가 생기면 재시작 하겠다는 옵션
(fastapi) PS D:\workspace\fastapi> python .\test.py

image

실행결과는 http://localhost:8000 으로 확인할 수 있다. (8000번은 uvicorn 기본 port 값임)

image

http://localhost:8000/docs 로 이동하면 자동 생성된 스웨거 문서도 볼 수 있다. Swagger의 또 다른 장점은 try it out을 누르면 실행해 볼 수 있다는 것이다. 즉, 문서에서 API 테스트를 할 수 있다.

image


pydantic 라이브러리

앞에서 fastapi와 uvicorn을 설치했다. pip list를 찍어보면 starlette과 pydantic가 자동으로 설치된 것을 확인할 수 있다.

image

Starlette은 FastAPI가 사용하는 웹 프레임워크이다. 사실 FastAPI는 Starlette의 랩퍼 프로젝트이다. 즉, 내부 코어는 starlette이지만 사용자의 편의를 위해 바꾼게 fastapi라고 보면 된다.

pydantic은 파이썬 타입 어노테이션 문법(타임 힌트)에 근거하여 데이터 검증을 해주는 라이브러리이다.

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel


class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: Optional[datetime] = None
    friends: List[int] = []


external_data = {
    'id': '123',
    'signup_ts': '2019-06-01 12:22',
    'friends': [1, 2, '3'],
}

user = User(**external_data)
print(user.id)
#> 123
print(repr(user.signup_ts))
#> datetime.datetime(2019, 6, 1, 12, 22)
print(user.friends)
#> [1, 2, 3]
print(user.dict())
"""
{
    'id': 123,
    'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
    'friends': [1, 2, 3],
    'name': 'John Doe',
}
"""

external_data 의 id를 보면 처음에 str 형식으로 전달되었다. 하지만 에러가 일어나지 않는다. 이는 pydantic 라이브러리가 단순히 타입 검사를 하는 것이 아니라 적절하게 변형(cast)을 해준다는 것을 알 수 있다. friends도 마찬가지고 ‘3’을 int 형으로 바꿔주었다.

pydantic 라이브러리가 유용한 이유는 다음과 같다. GET /users/123 을 호출한다 할 때 123이 실제로는 문자열이지만, 웹 애플리케이션에서는 정수형인지 문자열인지 알 수 없다. 이 때 pydantic을 사용하여 개발자가 원하는 타입으로 받을 수 있다.