FastAPI
FastAPI는 Python 3.6이상의 API를 빌드하기 위한 빠르고 현대적인 웹 프레임워크이다.
웹 부분을 위한 Starlette와 데이터 부분을 위한 Pydantic 덕분에 NodeJS와 Go에 대등할 정도로 높은 성능을 가지고 있으며, 빠른 코드 작성이 가능하다. 직관적이고 쉬운 코드로 인해 휴먼 에러가 약 40%(내부 개발팀 테스트 기준) 감소했다고 한다. 또한 API에 완전히 호환되는 개방형 표준을 기반으로 하여 Swagger(OpenAPI)와 json Schema를 지원한다.
개인적으로는 Flask와 문법이 비슷하지만 기본적으로 추가된 기능이 많고 Django보다는 자동화(?)는 덜 되었지만 훨씬 가볍고 빠르다는 느낌을 받았다.
자세한 내용은 아래 공식문서를 참고
https://fastapi.tiangolo.com/ko/
설치 및 실행
pip를 통해 설치한다. 제품화를 위해서는 Uvicorn이나 Hypercorn과 같은 ASGI 서버가 필요하다.
패키지의 설치는 https://hwan001.tistory.com/308 글을 참고하면 편하다.
pip install fastapi
pip install "uvicorn[standard]"
위 공식 링크에 있는 main.py 예제를 가져와봤다.
from typing import Union
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: Union[str, None] = None):
return {"item_id": item_id, "q": q}
위 10줄의 코드로 2개의 엔드포인트가 완성된다.
코드를 실행하려면 uvicorn이 필요하다.
uvicorn main:app --reload
공식 문서에서는 위 명령어로 방법을 설명하지만, pip로 "uvicorn[standard]"을 install 하면 에러가 발생하고 명령어로 쳐봐도 당연히 실행되지 않는다. 그래서 아래처럼 python 코드 상에서 실행하는 방법을 찾았다.
실행에 문제가 없고 디버깅 측면에서도 더 좋다고 생각한다.
from typing import Union
from fastapi import FastAPI
import uvicorn # pip install uvicorn
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
if __name__ == "__main__":
uvicorn.run(app, port=8000)
코드를 실행 후 http://127.0.0.1:8000/items/5?q=somequery로 접속하면 JSON 응답을 볼 수 있고,
http://127.0.0.1:8000/docs (또는 redoc)로가면 Swagger UI로 자동 작성된 API 문서를 볼 수 있다.
비동기 처리
FastAPI의 장점 중 하나는 비동기 처리를 지원한다는 점이다.
아래처럼 직접 작성한 코드나 라이브러리가 비동기 기능을 사용할 경우 async def 를 사용할 수 있다.
@app.get('/')
async def read_results():
results = await some_library()
return results
참고 링크
https://wikidocs.net/book/8531
https://github.com/tiangolo/fastapi
'프로그래밍 > Python' 카테고리의 다른 글
Jira label 필드 추가하기 (0) | 2023.10.22 |
---|---|
QR-CODE 생성하기 (2) | 2023.03.29 |
[Python] requirements.txt로 패키지 설치하기 (0) | 2023.01.12 |
[Python] 디렉토리 내부의 동일한 파일 찾기 (1) | 2022.12.10 |
[Python] Docstring (0) | 2022.11.27 |
[Python] OS 모듈 : 디렉토리 전체 탐색하기 (하위 디렉토리까지) (0) | 2022.11.20 |
댓글