FastAPI 파이썬 웹 프레임 워크(1)

김현진·2020년 10월 21일
1

사진에서 번개, 이름에 들어가는 Fast 뭔가 빠른 느낌이 나네요.....

FastAPI란

정의

  • FastAPI는 파이썬 3.6+ 으로 API서버를 구축하기 위한 모던하고, 빠른 웹 프레임 워크이다.

특징

  • Fast : 굉장히 빠른 퍼포먼스

  • Fast to code : 대략 200에서 300%정도 개발하는 속도를 향상시킴

  • Fewer bugs : 대략 40%정도의 에러를 감소시킴

  • Intuitive : 에디터 지원이 좋음. 디버깅하는데 속도를 줄여주고 어디든 완성되어있음.

  • Easy : 사용하고 배우기 편하게 디자인 되어있음. docs를 읽는 시간을 줄여줌

  • Short : 코드의 반복을 최소화함.

  • Robust : 프로덕션 단계 준비가 된 코드. 자동으로 문서를 생성해줌

  • Standards-based : API를 위한 오픈 스탠다드를 기준으로 함

어떤블로그에 공식문서 번역본이 있어 가지고 왔습니다.(참고)

설치

fastAPI에 들어가기전에 파이썬 의존성 관리자는 poetry를 사용하도록 하겠습니다.(의존성 관리자라고 해서 어렵게 느껴지지만 자바스크립트로 따지면 npm, yarn 라고 생각하시면 됩니다.)

poetry설치

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

설치 후 터미널 창에 poetry init 이라고 친 다음 설정항목이 뜨는데 기호에 맞게 설정하고, 그 후에 pyproject.toml이라는 파일이 생겼다.(package.json과 비슷한 폴더 인듯)

FastAPI, uvicorn 설치

poetry add fastapi uvicorn FastAPI, uvicorn을 설치 한다. 설치를 하면 poetry.lock 파일이 생기는데 같은 의존성을 설치할 수 있도록 보장 해주는걸로 알고 있다.(npm의 package.lock.json과 비슷한 느낌)

공식문서 보면서 실습

create it

  • main.py 폴더 생성 후 코드 작성

from typing import Optional # 타입 힌팅
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel): # 객체를 typing(타입정의) 할때는 BaseModel를 상속받아 정의
    name: str
    price: float
    is_offer: Optional[bool] = None
    
  

@app.get('/') # '/' get 요청이 온다면 응답값으로 "Hello World"를 반환
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}
  
# endpoint /items/이부분은 정해지지 않은값 => ex) 1,2,3,4,5 어떤값이 와도 됨
# 단 밑에서 보면 타입을 int로 제한을 두었기때문에 int형 자료형만 와야됨
# Optional은 이 변수가 있을 수도 있고, 없을 수도 있다라는 옵션널 한 값이다 라는것을 명시

# ex) /items/2 => {"item_id": 2, "q": null} 
# ex) /items/2?q=apple => {"item_id": 2, "q": apple}

# '/' == http://localhost:8000

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}
 
@app.post("/items/add")
def add_item(item: Item):
    print(item)
    return {"success": True}
    
# body(payload값)는 함수의 파라미터 값으로 받는다.

공식문서에서는 http://127.0.0.1:8000/docs 로 api Test를 하고 있지만 나는 Postman으로 동작Test

요청

응답


요청

응답

Dockerfile 작성

FROM tiangolo/uvicorn-gunicorn:python3.7

# Install Poetry
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \
    cd /usr/local/bin && \
    ln -s /opt/poetry/bin/poetry && \
    poetry config virtualenvs.create false


WORKDIR /app

COPY ./pyproject.toml ./poetry.lock* /app/

# install dependencies
RUN poetry install --no-root --no-dev

COPY ./ /app

CMD ["uvicorn", "main:app", "--reload", "--host=0.0.0.0", "--port=8000"]

docker build -t fast_api ./ 빌드 후 docker run -d -p 8000:8000 컨테이너를 실행

profile
기록의 중요성

0개의 댓글