본문 바로가기
Python/Python Web Framework

FastAPI 01. 첫걸음

by mintropy 2023. 1. 4.

FastAPI

FastAPI는 다른 Python 웹 프레임워크에 비하여 비교적 최근에 공개되었지만, 많은 관심을 받고 있다. FastAPI의 주요 특징으로는 빠른 속도, 빠른 코드 작성과 적은 버그, 쉽고 간결하며 견고함 등이 있다. 웹과 관련된 부분은 Starlette을, 데이터와 관련된 부분은 Pydantic을 사용한다. 또한 대화형 API 문서로 Swagger UI, ReDoc을 제공한다.

FastAPI 첫걸음

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello, FastAPI"}

기본적인 FastAPI앱 구조는 다음과 같다. FastAPI 클래스를 불러와서 나의 앱 객체에 할당하고, 각 API를 생성할 때 데코레이터와 API함수 선언을 활용하여 API의 스키마들을 선언한다. 위의 코드에서는 GET메서드에서 루트("/")로 request를 보낸다면 root() 함수의 반환값이 response로 받을 수 있다.
서버를 실행시키기 위해서는 uvicorn main:app --reload를 커맨드 창에서 실행하면 된다. 여기서 main:appmain.pyapp 객체를 실행하는 것을 의미하며, --reload는 코드가 변경되면 서버가 자동적으로 재시작되는 옵션이다.
기본적인 FastAPI 앱 작성을 보면 다음과 같다.

경로 매개변수(path parameter)

@app.get("/items/{item_id}")
async def get_item(item_id: int):
    return {"item_id": item_id}

경로 매개변수는 API의 경로를 문자열로 선언할 때 대괄호{}를 사용하고, 함수의 변수로 지정하면 된다. 그러면 /items/1, /items/15 등과 같이 사용할 수 있다. 여기서 item_id의 변수 타입을 지정하고 싶다면 변수를 파이썬 문법에 따라 타입을 지정하면 된다.

쿼리 매개변수(query parameter)

@app.get("/item/")
async def get_item_detail(start: int = 0, end: int = 0):
    return {"count": end - start + 1}

쿼리 매개변수는 URL에서? 이후에 &쌍으로 구분한 키-값의 쌍이다. FastAPI에서 활용할 때 경로 매개변수와 유사하게 사용할 수 있으나 경로를 지정하는 문자열은 무시하고 함수의 변수로만 지정하면 된다. 이후에는 경로 매개변수와 마찬가지로 타입 지정 및 활용하면 된다.
매개변수는 초기값이 있을 수 있고, 필수 또는 선택인 경우도 있다. 선택적인 변수를 사용하려면 초기값을 None으로 지정하면 되고, 필수적인 변수는 초기값을 설정하지 않으면 된다. 초기값이 설정된 경우 기본값이 정해진 매개변수로 사용된다.

바디(request body)

from pydantic import BaseModel
class Item(BaseModel):
    id: int
    name: str
    description: str | None = None
    price: int

@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.dict()
    if item.price:
        item_dict["price"] = int(item_dict["price"] * (10 / 9))
    return {**item_dict}

바디의 값으로 사용할 때는 pydantic.BaseModel을 상속받은 모델을 선언하고, 이를 함수의 변수로 사용하면 된다. 처음 입력받은 값은 JSON이 되어, 이를 활용하기 위해 파이썬 딕셔너리로 변경한다. 그래서 item은. 을 사용해 값을 찾아가면 되고, 딕셔너리로 변경하면 파이썬의 방식으로 값을 찾아갈 수 있다.

요약

  • 경로 매개변수 : API 경로에서 대괄호{}를 사용하여 변수 입력
  • 쿼리 매개변수 : API를 선언하는 함수 내부에만 변수 선언, 선택 변수는 초기값을 None으로 필수 변수는 초기값을 지정하지 않으면 됨
  • 바디 : Pydantic모델을 선언하여 API에서 활용

댓글