이번 포스팅은 FastAPI를 사용하여
파이썬기반 Rest API 서버를 구축하는 내용
FastAPI 공식 사이트 : https://fastapi.tiangolo.com
FastAPI란,
" 공식 사이트에 나와있는 설명에 따르면,
FastAPI는 파이썬 3.6+ 으로 API서버를 구축하기 위한 모던하고, 빠른 웹 프레임 워크이다 "
주 특징으로는 아래와 같다.
- Fast : 굉장히 빠른 퍼포먼스
- Fast to code : 대략 200에서 300%정도 개발하는 속도를 향상시킴
- Fewer bugs : 대략 40%정도의 에러를 감소시킴
- Intuitive : 에디터 지원이 좋음. 디버깅하는데 속도를 줄여주고 어디든 완성되어있음.
- Easy : 사용하고 배우기 편하게 디자인 되어있음. docs를 읽는 시간을 줄여줌
- Short : 코드의 반복을 최소화함.
- Robust : 프로덕션 단계 준비가 된 코드. 자동으로 문서를 생성해줌
- Standards-based : API를 위한 오픈 스탠다드를 기준으로 함
위와 같이 공식문서에 내용이고, 실제로 사용해보며 다른 파이썬 기반 웹 프레임워크들과 비교 해 볼 예정
FastAPI 빠르게 시작하기
fastapi 설치
$ pip install fastapi
- 가장 기본이 되는 fastapi를 먼저 설치한다.
uvicorn 설치
$ pip install uvicorn
- fastapi와 함께 사용하는 uvicorn도 설치해준다.
실행을 위한 main.py 작성
$ vi main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return { "message" : "Hello World" }
- 빠르게 사용해보기 위해 기본이 되는 main.py를 생성하고 아래 내용을 입력
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 : 접속 원하는 포트를 지정해준다.
서버 접속
- 실제로 localhost:8000 접속 시 아래와 같은 return을 확인 할 수 있다.
- 자동으로 생성되는 문서 확인 : localhost:8000/docs 접속
request 테스트를 위한 main.py 작성
$ vi main.py
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.post('/items/')
async def create_item(item: Item):
return item
- 테스트를 위한 main.py 재 작성
- 데이터를 정의하기 위한 class작성.
- 이때 데이터의 타입까지 다 정함.
실제로 API 서버에 요청
# jupyter notebook 에서 한 줄 씩 실행
# 1. 필요한 라이브러리 임포트
import requests
import json
# 2. 요청 보낼 url 주소
url = "http://localhost:8000/items/"
# 3. 같이 보낼 데이터 작성
data = {"name": "new_challenge", "description":"test1", "price":2020, "tax":2021}
# 4. post로 API서버에 요청보내기
res = request.post(url, data=json.dumps(data))
# 5. 결과 확인하기
res.text
- res.tex로 결과 확인하기
- return 으로 item을 보냈기 때문에, 입력한 데이터가 그대로 리턴 된다.