해당 포스트는 FastAPI의 공식문서를 보고 글쓴이의 기준으로 요약 정리한 내용입니다. 간단한 변경점이나 생략된 부분들이 있습니다.
FastAPI는 파이썬을 활용하여 backend framework 입니다.
공식문서에 나와있는 설명은 아래와 같습니다.
FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints.
파이썬으로 backend를 구성할 때 처럼 기본적으로 가상환경을 설정해줍니다.
그 후 fastapi와 uvicorn를 설치해줍니다.
pip install fastapi
pip install uvicorn
uvicorn은 Uvloop과 httptools를 기반으로 구축된 빠른 ASGI 서버라고 생각하면 됩니다. 자세한건 공식문서를 참고해주시면 됩니다.
공식문서 기준으로 fastapi를 개발한 프로젝트는 uvicorn을 활용하여 실행합니다.
main.py를 만들고 아래 코드를 작성합니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
그 후 서버를 실행합니다. 명령어는 아래와 같습니다.
$ uvicorn main:app --reload
- main: main.py를 실행한다 라는 의미라고 생각하면 됩니다.
- app: main.py에 있는 app=FastAPI() 객체를 생성한다는 의미입니다.
- reload: 프로젝트에 변경점이 있을 경우 서버를 재실행해줍니다.
http://127.0.0.1:8000 또는 localhost:8000을 들어가 확인하면 아래 이미지와 같이 hello world가 나옵니다. (필자는 postman을 활용했습니다.)
경로를 매개변수를 받고 싶은 경우는 아래와 같이 사용하면 됩니다.
@app.get("/books/{book_id}")
def search_book(book_id):
return {"book_id": book_id}
예를 들어 책 검색을 할 경우 위와 같이 작성하면 book_id를 매개변수로 받아올 수 있습니다.
또한 FastAPI의 주요 특징인 type hint를 설정할 수 있습니다.
@app.get("/books/{book_id}")
def search_book(book_id: int):
return {"book_id": book_id}
위에서 간단하게 테스트 했던 것은 get 방식이었습니다. 이번에는 body에 데이터를 넣어서 전송 즉 post를 테스트해보겠습니다.
아래 내용을 작성합니다.
from pydantic import BaseModel
from typing import Optional
class Book(BaseModel):
name: str
author: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
@app.post("/books/")
def create_book(book: Book):
return book
Optional[X] is equivalent to Union[X, None]
이미지와 같이 테스트가 됩니다.
Optional 같은 경우 데이터를 넣지 않으면 null이 되지만 다른 데이터는 에러가 발생합니다.
FastAPI은 Swagger를 자동으로 제공해줍니다.
위의 api 작업을 한 후 http://localhost:8000/docs 들어갈 경우
아래 이미지 처럼 Swagger를 제공합니다.