FastAPI
FastAPI ํ๋ ์์ํฌ, ๊ณ ์ฑ๋ฅ, ๊ฐํธํ ํ์ต, ๋น ๋ฅธ ์ฝ๋ ์์ฑ, ์ค๋น๋ ํ๋ก๋์
๋ฌธ์: 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 ์ ํ๋ค์ด ํตํฉ๋๊ณ ์์ต๋๋ค."
"FastAPI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฑํํ์ฌ ์์ธก์ ์ป๊ธฐ ์ํด ์ฟผ๋ฆฌ๋ฅผ ์คํ ํ ์ ์๋ REST ์๋ฒ๋ฅผ ์์ฑํ์ต๋๋ค. [Ludwig์ ์ํด]"
"Netflix๋ ์ฐ๋ฆฌ์ ์คํ ์์ค ๋ฐฐํฌํ์ธ ์๊ธฐ ๊ด๋ฆฌ ์ค์ผ์คํธ๋ ์ด์ ํ๋ ์์ํฌ๋ฅผ ๋ฐํํ ์ ์์ด ๊ธฐ์ฉ๋๋ค: ๋ฐ๋ก Dispatch์ ๋๋ค! [FastAPI๋ก ๋น๋]"
"FastAPI๊ฐ ๋๋ฌด ์ข์์ ๊ตฌ๋ฆ ์๋ฅผ ๊ฑท๋๋ฏ ํฉ๋๋ค. ์ ๋ง ์ฆ๊ฒ์ต๋๋ค!"
"์์งํ, ๋น์ ์ด ๋ง๋ ๊ฒ์ ๋งค์ฐ ๊ฒฌ๊ณ ํ๊ณ ์ธ๋ จ๋์ด ๋ณด์ ๋๋ค. ์ฌ๋ฌ ๋ฉด์์ Hug๊ฐ ์ด๋ ๊ฒ ๋์์ผ๋ฉด ํฉ๋๋ค - ๊ทธ๊ฑธ ๋ง๋ ๋๊ตฐ๊ฐ๋ฅผ ๋ณด๋ ๊ฒ์ ๋ง์ ์๊ฐ์ ์ค๋๋ค."
"REST API๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ๋์ ์ธ ํ๋ ์์ํฌ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด FastAPI๋ฅผ ํ์ธํด ๋ณด์ญ์์ค. [...] ๋น ๋ฅด๊ณ , ์ฐ๊ธฐ ์ฝ๊ณ , ๋ฐฐ์ฐ๊ธฐ๋ ์ฝ์ต๋๋ค [...]"
"์ฐ๋ฆฌ API๋ฅผ FastAPI๋ก ๋ฐ๊ฟจ์ต๋๋ค [...] ์๋ง ์ฌ๋ฌ๋ถ๋ ์ข์ํ์ค ๊ฒ์ ๋๋ค [...]"
Typer, FastAPI์ CLI¶
์น API ๋์ ํฐ๋ฏธ๋์์ ์ฌ์ฉํ CLI ์ฑ์ ๋ง๋ค๊ณ ์๋ค๋ฉด, Typer๋ฅผ ํ์ธํด ๋ณด์ญ์์ค.
Typer๋ FastAPI์ ๋์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ FastAPI์ CLI๊ฐ ๋๊ธฐ ์ํด ์๊ฒผ์ต๋๋ค. โจ๏ธ ๐
์๊ตฌ์ฌํญ¶
Python 3.7+
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:
์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด, ๋ฌธ์์์ 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 ofmain.py
with the lineapp = 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 ์ ๊ณต):
๋์ API ๋ฌธ์¶
๊ทธ๋ฆฌ๊ณ ์ด์ http://127.0.0.1:8000/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 ๋ฌธ์๊ฐ ์ ๋ณธ๋ฌธ๊ณผ ํจ๊ป ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํฉ๋๋ค:
- "Try it out" ๋ฒํผ์ ํด๋ฆญํ๋ฉด, ๋งค๊ฐ๋ณ์๋ฅผ ์ฑ์ธ ์ ์๊ฒ ํด์ฃผ๊ณ ์ง์ API์ ์ํธ์์ฉ ํ ์ ์์ต๋๋ค:
- ๊ทธ๋ฌ๊ณ ๋์ "Execute" ๋ฒํผ์ ๋๋ฅด๋ฉด, ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ API์ ํต์ ํ๊ณ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์กํ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ ํ๋ฉด์ ํ์ํฉ๋๋ค:
๋์ API ๋ฌธ์ ์ ๊ทธ๋ ์ด๋¶
๊ทธ๋ฆฌ๊ณ ์ด์ , http://127.0.0.1:8000/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์ ๋ณํํ๊ฑฐ๋ JSON์ผ๋ก ๋ณํํ๋ ๊ฒ์ ์๋ํ.
- ๋ค์์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ฒ์ OpenAPI๋ก ๋ฌธ์ํ:
- ๋ํํ ๋ฌธ์ ์์คํ .
- ์ฌ๋ฌ ์ธ์ด๋ค์ ๋ํ ์๋ ํด๋ผ์ด์ธํธ ์ฝ๋ ์์ฑ ์์คํ .
- 2๊ฐ์ ๋ํํ ๋ฌธ์ ์น ์ธํฐํ์ด์ค๋ฅผ ์ง์ ์ ๊ณต.
์ฐ๋ฆฌ๋ ๊ทธ์ ์๋ฐ ๊ฒํก๊ธฐ๋ง ํ์ ๋ฟ์ธ๋ฐ ์ฌ๋ฌ๋ถ์ ๋ฒ์จ ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ณ ์์ต๋๋ค.
๋ค์ ์ค์ ๋ฐ๊ฟ๋ณด์ญ์์ค:
return {"item_name": item.name, "item_id": item_id}
...์์:
... "item_name": item.name ...
...์ผ๋ก:
... "item_price": item.price ...
...๊ทธ๋ฌ๊ณ ๋์ ์ฌ๋ฌ๋ถ์ ํธ์ง๊ธฐ๊ฐ ์์ฑ๊ณผ ํ์ ์ ์๊ณ ์๋ ์์ฑํ๋์ง ๋ณด์ญ์์ค:
๋ ๋ง์ ๊ธฐ๋ฅ์ ํฌํจํ ๋ณด๋ค ์์ ํ ์์ ์ ๊ฒฝ์ฐ, ํํ ๋ฆฌ์ผ - ์ฌ์ฉ์ ๊ฐ์ด๋๋ฅผ ๋ณด์ญ์์ค.
์คํฌ์ผ๋ฌ ์ฃผ์: ํํ ๋ฆฌ์ผ - ์ฌ์ฉ์ ๊ฐ์ด๋๋:
- ์๋ก ๋ค๋ฅธ ์ฅ์์์ ๋งค๊ฐ๋ณ์ ์ ์ธ: ํค๋, ์ฟ ํค, ํผ ํ๋ ๊ทธ๋ฆฌ๊ณ ํ์ผ.
maximum_length
๋๋regex
์ฒ๋ผ ์ ํจ์ฑ ์ ์ฝํ๋ ๋ฐฉ๋ฒ.- ๊ฐ๋ ฅํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์์กด์ฑ ์ฃผ์ ์์คํ .
- OAuth2 ์ง์์ ํฌํจํ JWT tokens ๋ฐ HTTP Basic์ ๊ฐ๋ ๋ณด์๊ณผ ์ธ์ฆ.
- (Pydantic ๋๋ถ์) ๊น์ ์ค์ฒฉ JSON ๋ชจ๋ธ์ ์ ์ธํ๋๋ฐ ๋ ์ง๋ณดํ (ํ์ง๋ง ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ด) ๊ธฐ์ .
- (Starlette ๋๋ถ์) ๋ง์ ์ถ๊ฐ ๊ธฐ๋ฅ:
- ์น ์์ผ
- GraphQL
- HTTPX ๋ฐ
pytest
์ ๊ธฐ๋ฐํ ๊ทนํ ์ฌ์ด ํ ์คํธ - CORS
- ์ฟ ํค ์ธ์
- ...๊ธฐํ ๋ฑ๋ฑ.
์ฑ๋ฅ¶
๋ ๋ฆฝ๋ TechEmpower ๋ฒค์น๋งํฌ์์ Uvicorn์์ ์๋ํ๋ FastAPI ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋น ๋ฅธ ํ๋ ์์ํฌ ์ค ํ๋๋ก Starlette์ Uvicorn(FastAPI์์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ)์๋ง ๋ฐ๋๊ณ ์์ต๋๋ค. (*)
์์ธํ ๋ด์ฉ์ ๋ฒค์น๋งํฌ ์น์ ์ ๋ณด์ญ์์ค.
์ ํ๊ฐ๋ฅํ ์์กด์ฑ¶
Pydantic์ด ์ฌ์ฉํ๋:
ujson
- ๋ ๋น ๋ฅธ JSON "ํ์ฑ".email_validator
- ์ด๋ฉ์ผ ์ ํจ์ฑ ๊ฒ์ฌ.
Starlette์ด ์ฌ์ฉํ๋:
HTTPX
-TestClient
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํ์.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 ๋ผ์ด์ผ์ค ์กฐ์ฝ์ ๋ฐ๋ผ ๋ผ์ด์ผ์ค๊ฐ ๋ถ์ฌ๋ฉ๋๋ค.