Skip to content

FastAPI

FastAPI

FastAPI ν”„λ ˆμž„μ›Œν¬, κ³ μ„±λŠ₯, κ°„νŽΈν•œ ν•™μŠ΅, λΉ λ₯Έ μ½”λ“œ μž‘μ„±, μ€€λΉ„λœ ν”„λ‘œλ•μ…˜

Test Coverage Package version


λ¬Έμ„œ: https://fastapi.tiangolo.com

μ†ŒμŠ€ μ½”λ“œ: https://github.com/tiangolo/fastapi


FastAPIλŠ” ν˜„λŒ€μ μ΄κ³ , λΉ λ₯΄λ©°(κ³ μ„±λŠ₯), 파이썬 ν‘œμ€€ νƒ€μž… νžŒνŠΈμ— κΈ°μ΄ˆν•œ Python3.6+의 APIλ₯Ό λΉŒλ“œν•˜κΈ° μœ„ν•œ μ›Ή ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•μœΌλ‘œ:

  • 빠름: (Starletteκ³Ό Pydantic 덕뢄에) NodeJS 및 Go와 λŒ€λ“±ν•  μ •λ„λ‘œ 맀우 높은 μ„±λŠ₯. μ‚¬μš© κ°€λŠ₯ν•œ κ°€μž₯ λΉ λ₯Έ 파이썬 ν”„λ ˆμž„μ›Œν¬ 쀑 ν•˜λ‚˜.

  • λΉ λ₯Έ μ½”λ“œ μž‘μ„±: μ•½ 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λ₯Ό 확인해 λ³΄μ„Έμš”. [...] λΉ λ₯΄κ³ , μ“°κΈ° 쉽고, λ°°μš°κΈ°λ„ μ‰½μŠ΅λ‹ˆλ‹€ [...]"

"우리 APIλ₯Ό FastAPI둜 λ°”κΏ¨μŠ΅λ‹ˆλ‹€ [...] μ•„λ§ˆ μ—¬λŸ¬λΆ„λ„ μ’‹μ•„ν•˜μ‹€ κ²λ‹ˆλ‹€ [...]"

Ines Montani - Matthew Honnibal - Explosion AI μ„€λ¦½μž - spaCy μ œμž‘μž (ref) - (ref)

Typer, FastAPI의 CLI

μ›Ή API λŒ€μ‹  ν„°λ―Έλ„μ—μ„œ μ‚¬μš©ν•  CLI 앱을 λ§Œλ“€κ³  μžˆλ‹€λ©΄, Typerλ₯Ό 확인해 λ³΄μ„Έμš”.

TyperλŠ” FastAPI의 λ™μƒμž…λ‹ˆλ‹€. 그리고 FastAPI의 CLIκ°€ 되기 μœ„ν•΄ μƒκ²ΌμŠ΅λ‹ˆλ‹€. ⌨️ πŸš€

μš”κ΅¬μ‚¬ν•­

Python 3.6+

FastAPIλŠ” κ±°μΈλ“€μ˜ μ–΄κΉ¨ μœ„μ— μ„œ μžˆμŠ΅λ‹ˆλ‹€:

  • μ›Ή 뢀뢄을 μœ„ν•œ Starlette.
  • 데이터 뢀뢄을 μœ„ν•œ Pydantic.

μ„€μΉ˜

$ pip install fastapi

---> 100%

ν”„λ‘œλ•μ…˜μ„ μœ„ν•΄ Uvicorn λ˜λŠ” Hypercornκ³Ό 같은 ASGI μ„œλ²„λ„ ν•„μš”ν•  κ²λ‹ˆλ‹€.

$ pip install uvicorn[standard]

---> 100%

예제

λ§Œλ“€κΈ°

  • main.py νŒŒμΌμ„ λ§Œλ“œμ„Έμš”:
from typing import Optional

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: Optional[str] = None):
    return {"item_id": item_id, "q": q}

λ˜λŠ” async def μ‚¬μš©ν•˜κΈ°...

μ—¬λŸ¬λΆ„μ˜ μ½”λ“œκ°€ async / await을 μ‚¬μš©ν•œλ‹€λ©΄, async defλ₯Ό μ‚¬μš©ν•˜μ„Έμš”:

from typing import Optional

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: Optional[str] = None):
    return {"item_id": item_id, "q": q}

Note:

잘 λͺ¨λ₯΄κ² λ‹€λ©΄, λ¬Έμ„œμ—μ„œ async와 await에 κ΄€ν•œ "κΈ‰ν•˜μ„Έμš”?" μ„Ήμ…˜μ„ 확인해 λ³΄μ„Έμš”.

μ‹€ν–‰ν•˜κΈ°

μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”:

$ 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 Optional

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


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


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


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = 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 3.6+μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, int에 λŒ€ν•΄μ„ :

item_id: int

λ˜λŠ” μ’€ 더 λ³΅μž‘ν•œ Item λͺ¨λΈμ— λŒ€ν•΄μ„ :

item: Item

...그리고 단 ν•˜λ‚˜μ˜ μ„ μ–ΈμœΌλ‘œ μ—¬λŸ¬λΆ„μ΄ μ–»λŠ” 것은:

  • λ‹€μŒμ„ ν¬ν•¨ν•œ νŽΈμ§‘κΈ° 지원:
    • μžλ™μ™„μ„±.
    • νƒ€μž… 검사.
  • 데이터 검증:
    • 데이터가 μœ νš¨ν•˜μ§€ μ•Šμ„ λ•Œ μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” λͺ…ν™•ν•œ μ—λŸ¬.
    • μ€‘μ²©λœ JSON 객체에 λŒ€ν•œ μœ νš¨μ„± 검사.
  • μž…λ ₯ 데이터 λ³€ν™˜: λ„€νŠΈμ›Œν¬μ—μ„œ 파이썬 데이터 및 νƒ€μž…μœΌλ‘œ 전솑. 읽을 수 μžˆλŠ” 것듀:
    • JSON.
    • 경둜 λ§€κ°œλ³€μˆ˜.
    • 쿼리 λ§€κ°œλ³€μˆ˜.
    • μΏ ν‚€.
    • 헀더.
    • 폼(Forms).
    • 파일.
  • 좜λ ₯ 데이터 λ³€ν™˜: 파이썬 데이터 및 νƒ€μž…μ„ λ„€νŠΈμ›Œν¬ λ°μ΄ν„°λ‘œ μ „ν™˜(JSON ν˜•μ‹μœΌλ‘œ):
    • 파이썬 νƒ€μž… λ³€ν™˜ (str, int, float, bool, list, λ“±).
    • datetime 객체.
    • UUID 객체.
    • λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈ.
    • ...더 λ§Žμ€ 것듀.
  • λŒ€μ•ˆκ°€λŠ₯ν•œ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό 2개 ν¬ν•¨ν•œ μžλ™ λŒ€ν™”ν˜• API λ¬Έμ„œ:
    • Swagger UI.
    • ReDoc.

이전 μ½”λ“œ 예제둜 λŒμ•„κ°€μ„œ, FastAPIλŠ” λ‹€μŒμ²˜λŸΌ μ²˜λ¦¬ν•©λ‹ˆλ‹€:

  • GET 및 PUT μš”μ²­μ— item_idκ°€ κ²½λ‘œμ— μžˆλŠ”μ§€ 검증.
  • GET 및 PUT μš”μ²­μ— item_idκ°€ int νƒ€μž…μΈμ§€ 검증.
    • 그렇지 μ•Šλ‹€λ©΄ ν΄λΌμ΄μ–ΈνŠΈλŠ” μœ μš©ν•˜κ³  λͺ…ν™•ν•œ μ—λŸ¬λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 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으둜, 그리고 μ—μ„œλΆ€ν„° μžλ™ λ³€ν™˜.
  • λ‹€μŒμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λͺ¨λ“  것을 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 tokens 및 HTTP Basic을 κ°–λŠ” λ³΄μ•ˆκ³Ό 인증.
  • (Pydantic 덕뢄에) κΉŠμ€ 쀑첩 JSON λͺ¨λΈμ„ μ„ μ–Έν•˜λŠ”λ° 더 μ§„λ³΄ν•œ (ν•˜μ§€λ§Œ λ§ˆμ°¬κ°€μ§€λ‘œ μ‰¬μš΄) 기술.
  • (Starlette 덕뢄에) λ§Žμ€ μΆ”κ°€ κΈ°λŠ₯:
    • μ›Ή μ†ŒμΌ“
    • GraphQL
    • requests 및 pytest에 κΈ°λ°˜ν•œ 극히 μ‰¬μš΄ ν…ŒμŠ€νŠΈ
    • CORS
    • μΏ ν‚€ μ„Έμ…˜
    • ...기타 λ“±λ“±.

μ„±λŠ₯

λ…λ¦½λœ TechEmpower λ²€μΉ˜λ§ˆν¬μ—μ„œ Uvicornμ—μ„œ μž‘λ™ν•˜λŠ” FastAPI μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš© κ°€λŠ₯ν•œ κ°€μž₯ λΉ λ₯Έ ν”„λ ˆμž„μ›Œν¬ 쀑 ν•˜λ‚˜λ‘œ Starlette와 Uvicorn(FastAPIμ—μ„œ λ‚΄λΆ€μ μœΌλ‘œ μ‚¬μš©)μ—λ§Œ λ°‘λŒκ³  μžˆμŠ΅λ‹ˆλ‹€. (*)

μžμ„Έν•œ λ‚΄μš©μ€ 벀치마크 μ„Ήμ…˜μ„ λ³΄μ„Έμš”.

선택가λŠ₯ν•œ 쒅속사항

Pydantic이 μ‚¬μš©ν•˜λŠ”:

  • ujson - 더 λΉ λ₯Έ JSON "νŒŒμ‹±".
  • email_validator - 이메일 μœ νš¨μ„± 검사.

Starlette이 μ‚¬μš©ν•˜λŠ”:

  • requests - TestClientλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν•„μš”.
  • aiofiles - FileResponse λ˜λŠ” StaticFilesλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν•„μš”.
  • jinja2 - κΈ°λ³Έ ν…œν”Œλ¦Ώ 섀정을 μ‚¬μš©ν•˜λ €λ©΄ ν•„μš”.
  • python-multipart - request.form()κ³Ό ν•¨κ»˜ "parsing"의 지원을 μ›ν•˜λ©΄ ν•„μš”.
  • itsdangerous - SessionMiddleware 지원을 μœ„ν•΄ ν•„μš”.
  • pyyaml - Starlette의 SchemaGenerator 지원을 μœ„ν•΄ ν•„μš” (FastAPI와 μ“Έλ•ŒλŠ” ν•„μš”κ°€ 없을 κ²λ‹ˆλ‹€).
  • graphene - GraphQLApp 지원을 μœ„ν•΄ ν•„μš”.
  • ujson - UJSONResponseλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν•„μš”.

FastAPI / Starlette이 μ‚¬μš©ν•˜λŠ”:

  • uvicorn - μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‘œλ“œν•˜κ³  μ œκ³΅ν•˜λŠ” μ„œλ²„.
  • orjson - ORJSONResponse을 μ‚¬μš©ν•˜λ €λ©΄ ν•„μš”.

pip install fastapi[all]λ₯Ό 톡해 이 λͺ¨λ‘λ₯Ό μ„€μΉ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΌμ΄μ„ΌμŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ΌμŠ€ 쑰약에 따라 λΌμ΄μ„ΌμŠ€κ°€ λΆ€μ—¬λ©λ‹ˆλ‹€.