본문 바로가기

FastAPI

[FastAPI] Simple FastAPI

728x90

Overview

API 프로젝트가 있어 여러 언어와 웹 프레임워크를 조사하면서 FastAPI에 눈길이 가게 되었다. 최근에 파이썬으로 프로젝트를 진행한 경험도 있고, 파이썬의 생산 능력이 너무 좋다는 것도 잘 알게 되어서 잠깐 테스트를 해보게 되었다. FastAPI 를 찍먹 해보면서 느낀 주관적인 몇 가지 특징이 있다.

  • 코드 작성이 굉장히 직관적이다. (파이썬과 웹 동작에 대한 이해만 있다면 어떤 언어를 한 사람이라도 금방 접근 할 수 있을 것 같다.)
  • 테스트 코드도 쉽게 작성할 수 있는 것 같다.
  • 위 두 특징과 더불어 Swagger UI가 자동으로 완성해주는 덕분에 매우 빠른 개발 속도가 나온다.
  • 공식 문서가 굉장히 잘 되어 있는 것 같다.
  • 깃허브 스타도 가파르게 상승하고 있으며 관심도도 많아 커뮤니티가 활성화 되어 있는 느낌이 든다.
  • Pydantic을 이용한 Validation이 이해만 한다면 굉장히 편리한 것 같다.
  • API가 빠르다고는 하지만 역시 파이썬에서 오는 성능은 역시나 아쉽다.

 

FastAPI 기본 실행을 위한 방법입니다.

 

main.py

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None):
    return {"item_id": item_id, "q": q}

 

Run FastAPI

  • --reload : 런타임 상에서 코드 수정 시 재적용을 위한 옵션 (Production 환경에서는 사용하지 않는게 좋다.)
  • --workers : 워커 프로세스의 개수
  • --host : Listen 하는 호스트
  • --port : Listen 하는 포트
> uvicorn main:app --reload --workers 2 --host 0.0.0.0 --port 8080 
INFO:     Will watch for changes in these directories: ['/Users/myuser/project/python/simple-fastapi']
WARNING:  "workers" flag is ignored when reloading is enabled.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
INFO:     Started reloader process [20959] using WatchFiles
INFO:     Started server process [20961]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
...
...
...

 

Run Test

# 기본 루트 요청
> curl -v http://localhost:8080/
*   Trying 127.0.0.1:8080...
...
...
{"Hello":"World"}

# Query Parameter를 조합한 요청
> curl -v 'http://localhost:8080/items/1234?q=justitem'
*   Trying 127.0.0.1:8080...
...
...
{"item_id":1234,"q":"justitem"}

# 존재하지 않는 자원에 대한 요청
> curl -v http://localhost:8080/a                      
*   Trying 127.0.0.1:8080...
...
...
< HTTP/1.1 404 Not Found
...
...
{"detail":"Not Found"}


# 잘못된 Path Parameter를 포함한 요청
> curl -v 'http://localhost:8080/items/aa?q=aa'   
*   Trying 127.0.0.1:8080...
...
...
< HTTP/1.1 422 Unprocessable Entity
...
...
{"detail":[{"type":"int_parsing","loc":["path","item_id"],"msg":"Input should be a valid integer, unable to parse string as an integer","input":"aa","url":"https://errors.pydantic.dev/2.4/v/int_parsing"}]}


# 잘못된 데이터를 포함한 요청
# Query Parameter와 변수명을 자동으로 매치해주고 Validation도 수행한다.
> curl -v 'http://localhost:8080/items/1234?qa=1234'
*   Trying 127.0.0.1:8080...
...
...
< HTTP/1.1 422 Unprocessable Entity
...
...
{"detail":[{"type":"missing","loc":["query","q"],"msg":"Field required","input":null,"url":"https://errors.pydantic.dev/2.4/v/missing"}]}
728x90

'FastAPI' 카테고리의 다른 글

[FastAPI] Depends를 이용한 Validation  (0) 2024.02.28
[FastAPI] Pydantic을 이용한 Validation  (1) 2024.02.24