콘텐츠로 이동

FastAPI

FastAPI

FastAPI 프레임워크, 고성능, 간편한 학습, 빠른 코드 작성, 준비된 프로덕션

Test Coverage Package version


문서: https://fastapi.tiangolo.com

소스 코드: https://github.com/fastapi/fastapi


FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python의 API를 빌드하기 위한 웹 프레임워크입니다.

주요 특징으로:

  • 빠름: (Starlette과 Pydantic 덕분에) NodeJSGo와 대등할 정도로 매우 높은 성능. 사용 가능한 가장 빠른 파이썬 프레임워크 중 하나.

  • 빠른 코드 작성: 약 200%에서 300%까지 기능 개발 속도 증가. *

  • 적은 버그: 사람(개발자)에 의한 에러 약 40% 감소. *
  • 직관적: 훌륭한 편집기 지원. 모든 곳에서 자동완성. 적은 디버깅 시간.
  • 쉬움: 쉽게 사용하고 배우도록 설계. 적은 문서 읽기 시간.
  • 짧음: 코드 중복 최소화. 각 매개변수 선언의 여러 기능. 적은 버그.
  • 견고함: 준비된 프로덕션 용 코드를 얻으십시오. 자동 대화형 문서와 함께.
  • 표준 기반: API에 대한 (완전히 호환되는) 개방형 표준 기반: OpenAPI (이전에 Swagger로 알려졌던) 및 JSON 스키마.

* 내부 개발팀의 프로덕션 애플리케이션을 빌드한 테스트에 근거한 측정

골드 스폰서

다른 스폰서

의견들

"[...] 저는 요즘 FastAPI를 많이 사용하고 있습니다. [...] 사실 우리 팀의 마이크로소프트 ML 서비스 전부를 바꿀 계획입니다. 그중 일부는 핵심 Windows와 몇몇의 Office 제품들이 통합되고 있습니다."

Kabir Khan - 마이크로소프트 (ref)

"FastAPI 라이브러리를 채택하여 예측을 얻기 위해 쿼리를 실행 할 수 있는 REST 서버를 생성했습니다. [Ludwig을 위해]"

Piero Molino, Yaroslav Dudin 그리고 Sai Sumanth Miryala - 우버 (ref)

"Netflix는 우리의 오픈 소스 배포판인 위기 관리 오케스트레이션 프레임워크를 발표할 수 있어 기쁩니다: 바로 Dispatch입니다! [FastAPI로 빌드]"

Kevin Glisson, Marc Vilanova, Forest Monsen - 넷플릭스 (ref)

"FastAPI가 너무 좋아서 구름 위를 걷는듯 합니다. 정말 즐겁습니다!"

Brian Okken - Python Bytes 팟캐스트 호스트 (ref)

"솔직히, 당신이 만든 것은 매우 견고하고 세련되어 보입니다. 여러 면에서 Hug가 이렇게 되었으면 합니다 - 그걸 만든 누군가를 보는 것은 많은 영감을 줍니다."

Timothy Crosley - Hug 제작자 (ref)

"REST API를 만들기 위해 현대적인 프레임워크를 찾고 있다면 FastAPI를 확인해 보십시오. [...] 빠르고, 쓰기 쉽고, 배우기도 쉽습니다 [...]"

"우리 APIFastAPI로 바꿨습니다 [...] 아마 여러분도 좋아하실 것입니다 [...]"

Ines Montani - Matthew Honnibal - Explosion AI 설립자 - spaCy 제작자 (ref) - (ref)

Typer, FastAPI의 CLI

웹 API 대신 터미널에서 사용할 CLI 앱을 만들고 있다면, Typer를 확인해 보십시오.

Typer는 FastAPI의 동생입니다. 그리고 FastAPI의 CLI가 되기 위해 생겼습니다. ⌨️ 🚀

요구사항

FastAPI는 거인들의 어깨 위에 서 있습니다:

설치

$ pip install fastapi

---> 100%

프로덕션을 위해 Uvicorn 또는 Hypercorn과 같은 ASGI 서버도 필요할 겁니다.

$ pip install "uvicorn[standard]"

---> 100%

예제

만들기

  • 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}
또는 async def 사용하기...

여러분의 코드가 async / await을 사용한다면, async def를 사용하십시오.

from typing import Union

from fastapi import FastAPI

app = FastAPI()


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


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
    return {"item_id": item_id, "q": q}

Note:

잘 모르겠다면, 문서에서 asyncawait에 관한 "급하세요?" 섹션을 확인해 보십시오.

실행하기

서버를 실행하십시오:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
uvicorn main:app --reload 명령에 관하여...

명령 uvicorn main:app은 다음을 나타냅니다:

  • main: main.py 파일 (파이썬 "모듈").
  • app: the object created inside of main.py with the line app = FastAPI().
  • --reload: 코드가 변경된 후 서버 재시작하기. 개발환경에서만 사용하십시오.

확인하기

브라우저로 http://127.0.0.1:8000/items/5?q=somequery를 열어보십시오.

아래의 JSON 응답을 볼 수 있습니다:

{"item_id": 5, "q": "somequery"}

여러분은 벌써 API를 만들었습니다:

  • 경로 //items/{item_id}에서 HTTP 요청 받기.
  • 경로 모두 GET 연산(HTTP 메소드 로 알려진)을 받습니다.
  • 경로 /items/{item_id}경로 매개변수 int형 이어야 하는 item_id를 가지고 있습니다.
  • 경로 /items/{item_id}는 선택적인 str형 이어야 하는 경로 매개변수 q를 가지고 있습니다.

대화형 API 문서

이제 http://127.0.0.1:8000/docs로 가보십시오.

자동 대화형 API 문서를 볼 수 있습니다 (Swagger UI 제공):

Swagger UI

대안 API 문서

그리고 이제 http://127.0.0.1:8000/redoc로 가봅시다.

다른 자동 문서를 볼 수 있습니다(ReDoc 제공):

ReDoc

예제 심화

이제 PUT 요청에 있는 본문(Body)을 받기 위해 main.py를 수정해봅시다.

Pydantic을 이용해 파이썬 표준 타입으로 본문을 선언합니다.

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Union[bool, None] = None


@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}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

서버가 자동으로 리로딩 할 수 있어야 합니다 (위에서 uvicorn 명령에 --reload을 추가 했기 때문입니다).

대화형 API 문서 업그레이드

이제 http://127.0.0.1:8000/docs로 이동합니다.

  • 대화형 API 문서가 새 본문과 함께 자동으로 업데이트 합니다:

Swagger UI

  • "Try it out" 버튼을 클릭하면, 매개변수를 채울 수 있게 해주고 직접 API와 상호작용 할 수 있습니다:

Swagger UI interaction

  • 그러고 나서 "Execute" 버튼을 누르면, 사용자 인터페이스는 API와 통신하고 매개변수를 전송하며 그 결과를 가져와서 화면에 표시합니다:

Swagger UI interaction

대안 API 문서 업그레이드

그리고 이제, http://127.0.0.1:8000/redoc로 이동합니다.

  • 대안 문서 역시 새 쿼리 매개변수와 본문을 반영합니다:

ReDoc

요약

요약하면, 여러분은 매개변수의 타입, 본문 등을 함수 매개변수로서 한번에 선언했습니다.

여러분은 현대 표준 파이썬 타입으로 이를 행했습니다.

새로운 문법, 특정 라이브러리의 메소드나 클래스 등을 배울 필요가 없습니다.

그저 표준 Python 입니다.

예를 들어, int에 대해선:

item_id: int

또는 좀 더 복잡한 Item 모델에 대해선:

item: Item

...그리고 단 하나의 선언으로 여러분이 얻는 것은:

  • 다음을 포함한 편집기 지원:
    • 자동완성.
    • 타입 검사.
  • 데이터 검증:
    • 데이터가 유효하지 않을 때 자동으로 생성하는 명확한 에러.
    • 중첩된 JSON 객체에 대한 유효성 검사.
  • 입력 데이터 변환: 네트워크에서 파이썬 데이터 및 타입으로 전송. 읽을 수 있는 것들:
    • JSON.
    • 경로 매개변수.
    • 쿼리 매개변수.
    • 쿠키.
    • 헤더.
    • 폼(Forms).
    • 파일.
  • 출력 데이터 변환: 파이썬 데이터 및 타입을 네트워크 데이터로 전환(JSON 형식으로):
    • 파이썬 타입 변환 (str, int, float, bool, list, 등).
    • datetime 객체.
    • UUID 객체.
    • 데이터베이스 모델.
    • ...더 많은 것들.
  • 대안가능한 사용자 인터페이스를 2개 포함한 자동 대화형 API 문서:
    • Swagger UI.
    • ReDoc.

이전 코드 예제로 돌아가서, FastAPI는 다음처럼 처리합니다:

  • GETPUT 요청에 item_id가 경로에 있는지 검증.
  • GETPUT 요청에 item_idint 타입인지 검증.
    • 그렇지 않다면 클라이언트는 유용하고 명확한 에러를 볼 수 있습니다.
  • GET 요청에 q라는 선택적인 쿼리 매개변수가 검사(http://127.0.0.1:8000/items/foo?q=somequery처럼).
    • q 매개변수는 = None으로 선언되었기 때문에 선택사항입니다.
    • None이 없다면 필수사항입니다(PUT의 경우와 마찬가지로).
  • /items/{item_id}으로의 PUT 요청은 본문을 JSON으로 읽음:
    • name을 필수 속성으로 갖고 str 형인지 검사.
    • price을 필수 속성으로 갖고 float 형인지 검사.
    • 만약 주어진다면, is_offer를 선택 속성으로 갖고 bool 형인지 검사.
    • 이 모든 것은 깊이 중첩된 JSON 객체에도 적용됩니다.
  • JSON을 변환하거나 JSON으로 변환하는 것을 자동화.
  • 다음에서 사용할 수 있는 모든 것을 OpenAPI로 문서화:
    • 대화형 문서 시스템.
    • 여러 언어들에 대한 자동 클라이언트 코드 생성 시스템.
  • 2개의 대화형 문서 웹 인터페이스를 직접 제공.

우리는 그저 수박 겉 핥기만 했을 뿐인데 여러분은 벌써 어떻게 작동하는지 알고 있습니다.

다음 줄을 바꿔보십시오:

    return {"item_name": item.name, "item_id": item_id}

...에서:

        ... "item_name": item.name ...

...으로:

        ... "item_price": item.price ...

...그러고 나서 여러분의 편집기가 속성과 타입을 알고 자동 완성하는지 보십시오:

editor support

더 많은 기능을 포함한 보다 완전한 예제의 경우, 튜토리얼 - 사용자 가이드를 보십시오.

스포일러 주의: 튜토리얼 - 사용자 가이드는:

  • 서로 다른 장소에서 매개변수 선언: 헤더, 쿠키, 폼 필드 그리고 파일.
  • maximum_length 또는 regex처럼 유효성 제약하는 방법.
  • 강력하고 사용하기 쉬운 의존성 주입 시스템.
  • OAuth2 지원을 포함한 JWT tokensHTTP Basic을 갖는 보안과 인증.
  • (Pydantic 덕분에) 깊은 중첩 JSON 모델을 선언하는데 더 진보한 (하지만 마찬가지로 쉬운) 기술.
  • (Starlette 덕분에) 많은 추가 기능:
    • 웹 소켓
    • GraphQL
    • HTTPX 및 pytest에 기반한 극히 쉬운 테스트
    • CORS
    • 쿠키 세션
    • ...기타 등등.

성능

독립된 TechEmpower 벤치마크에서 Uvicorn에서 작동하는 FastAPI 어플리케이션이 사용 가능한 가장 빠른 프레임워크 중 하나로 Starlette와 Uvicorn(FastAPI에서 내부적으로 사용)에만 밑돌고 있습니다. (*)

자세한 내용은 벤치마크 섹션을 보십시오.

선택가능한 의존성

Pydantic이 사용하는:

Starlette이 사용하는:

  • HTTPX - TestClient를 사용하려면 필요.
  • jinja2 - 기본 템플릿 설정을 사용하려면 필요.
  • python-multipart - request.form()과 함께 "parsing"의 지원을 원하면 필요.
  • itsdangerous - SessionMiddleware 지원을 위해 필요.
  • pyyaml - Starlette의 SchemaGenerator 지원을 위해 필요 (FastAPI와 쓸때는 필요 없을 것입니다).
  • graphene - GraphQLApp 지원을 위해 필요.

FastAPI / Starlette이 사용하는:

  • uvicorn - 애플리케이션을 로드하고 제공하는 서버.
  • orjson - ORJSONResponse을 사용하려면 필요.
  • ujson - UJSONResponse를 사용하려면 필요.

pip install fastapi[all]를 통해 이 모두를 설치 할 수 있습니다.

라이센스

이 프로젝트는 MIT 라이센스 조약에 따라 라이센스가 부여됩니다.