FastAPI
ืชืฉืชืืช FastAPI, ืืืฆืืขืื ืืืืืื, ืงืื ืืืืืื, ืืืืจื ืืชืื ืืช, ืืืื ื ืืกืืืืช ืืืฆืืจ
ืชืืขืื: https://fastapi.tiangolo.com
ืงืื: https://github.com/tiangolo/fastapi
FastAPI ืืื ืชืฉืชืืช ืจืฉืช ืืืืจื ืืช ืืืืืจื (ืืืฆืืขืื ืืืืืื) ืืื ืืืช ืืืฉืงื ืชืื ืืช ืืืฉืืืื (API) ืขื ืคืืืชืื 3.6+ ืืืชืืกืก ืขื ืจืืื ืืืคืืกืื ืกืื ืืจืืืื.
ืชืืื ืืช ืืืคืชื ืื:
-
ืืืืจื: ืืืฆืืขืื ืืืืืื ืืืื, ืืงื ื ืืื ืขื NodeJS ื - Go (ืชืืืืช ื - Starlette ื - Pydantic). ืืืช ืืชืฉืชืืืช ืืคืืืชืื ืืืืืจืืช ืืืืชืจ.
-
ืืืืจื ืืชืื ืืช: ืืืืืจื ืืช ืืืืจืืช ืคืืชืื ืืชืืื ืืช ืืืืฉืืช ืื - %200 ืขื %300. *
- ืคืืืช ืฉืืืืืช: ืื ืขื ื - %40 ืืฉืืืืืช ืื ืืฉ (ืืคืชืืื). *
- ืืื ืืืืืืืืืช: ืชืืืืช ืขืืจื ืืขืืื. ืืฉืืื ืืื ืืงืื. ืคืืืช ืืื ื ืืคืื ืฉืืืืืช.
- ืงืื: ืืชืืื ื ืช ืืืืืช ืงืื ืืฉืืืืฉ ืืืืืืื. ืคืืืช ืืื ืงืจืืืช ืชืืขืื.
- ืงืฆืจื: ืืืขืจื ืฉืืคืื ืงืื. ืืกืคืจ ืชืืื ืืช ืืื ืืืจืืช ืคืจืืืจ. ืคืืืช ืฉืืืืืช.
- ืืกืื ื: ืงืืื ืงืื ืืืื ืืกืืืืช ืืืฆืืจ. ืขื ืชืืขืื ืืื ืืจืงืืืื ืืืืืืื.
- ืืืืกืกืช ืกืื ืืจืืื: ืืืืกืกืช ืขื (ืืชืืืืช ืืืืืืื ื -) ืืกืืื ืจืืื ืืคืชืืืื ืืืืฉืงื ืชืื ืืช ืืืฉืืืื: OpenAPI (ืืืืขืื ืืฉืขืืจ ื - Swagger) ื - JSON Schema.
* ืืขืจืื ืืืืกืกืช ืขื ืืืืงืืช ืฉื ืฆืืืช ืคืืชืื ืคื ืืื ืฉืืื ื ืืคืืืงืฆืืืช ืืกืืืืช ืืืฆืืจ.
ื ืืชื ื ืืกืืช¶
ื ืืชื ื ืืกืืช ืืืจืื
ืืขืืช¶
"[...] I'm using FastAPI a ton these days. [...] I'm actually planning to use it for all of my team's ML services at Microsoft. Some of them are getting integrated into the core Windows product and some Office products."
"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]"
"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]"
"Iโm over the moon excited about FastAPI. Itโs so fun!"
"Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted Hug to be - it's really inspiring to see someone build that."
"If you're looking to learn one modern framework for building REST APIs, check out FastAPI [...] It's fast, easy to use and easy to learn [...]"
"We've switched over to FastAPI for our APIs [...] I think you'll like it [...]"
Typer, ื - FastAPI ืฉื ืืืฉืงื ืฉืืจืช ืคืงืืื (CLI).¶
ืื ืืชื ืืื ืื ืืคืืืงืฆืืืช CLI ืืฉืืืืฉ ืืืกืืฃ ืืืงืื ืืืฉืง ืจืฉืช, ืืขืืคื ืืื ืขื Typer.
Typer ืืื ืืืืชื ืืงืื ื ืฉื FastAPI. ืืืืจืชื ืืื ืืืืืช ื - FastAPI ืฉื ืืืฉืงื ืฉืืจืช ืคืงืืื. โจ๏ธ ๐
ืชืืืืืช¶
ืคืืืชืื 3.6+
FastAPI ืขืืืืช ืขื ืืชืคื ืขื ืงืืืช:
ืืชืงื ื¶
$ pip install fastapi
---> 100%
ืชืฆืืจืื ืื ืฉืจืช ASGI ืืืื Uvicorn ืื Hypercorn.
$ 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}
ืฉืืื ืื:
ืื ืืื ืื ืืืืขืื, ืืืงื ืืช ืคืจืง "ืืืืจืื?" ืขื 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
: ืืืืืืืงื ืฉื ืืฆืจ ืืชืืmain.py
ืขื ืืฉืืจืapp = FastAPI()
.--reload
: ืืจืื ืืฉืจืช ืืืชืืชืื ืืืืจ ืฉืื ืืืื ืืงืื. ืขืฉื ืืืช ืจืง ืืกืืืืช ืคืืชืื.
ืืืงื ืืืชื¶
ืคืชืื ืืช ืืืคืืคื ืฉืืื ืืืชืืืช http://127.0.0.1:8000/items/5?q=somequery.
ืืชื ืชืจืื ืชืืืืช JSON:
{"item_id": 5, "q": "somequery"}
ืืืจ ืืฆืจืชื API ืฉ:
- ืืงืื ืืงืฉืืช HTTP ืื ืชืืืื
/
ื -/items/{item_id}
. - ืฉื ื ื ื ืชืืืื ืืงืืืื ืืงืฉืืช
GET
(ืืืืขืืช ืื ืืืชืืืืช HTTP). - ื ื ืชืื
/items/{item_id}
ืืืื *ืคืจืืืจ ื ืชืื_item_id
ืฉืืืืจ ืืืืืชint
. - ื ื ืชืื
/items/{item_id}
*ืคืจืืืจ ืฉืืืืชื_ ืืืคืฆืืื ืืq
.
ืชืืขืื API ืืื ืืจืงืืืื¶
ืืขืช ืคื ื ืืืชืืืช http://127.0.0.1:8000/docs.
ืืชื ืชืจืื ืืช ืืชืืขืื ืืืืืืืื (ืืกืืคืง ืขื ืืื Swagger UI):
ืชืืขืื ืืืืจื ืืืื¶
ืืขืช ืคื ื ืืืชืืืช http://127.0.0.1:8000/redoc.
ืืชื ืชืจืื ืชืืขืื ืืืืจื ืืืื (ืืกืืคืง ืขื ืืื ReDoc):
ืฉืืจืื ืืืืืื¶
ืืขืช ืขืจืื ืืช ืืงืืืฅ main.py
ืื ืฉืืืื ืืงืื ืืืฃ ืืืงืฉืช PUT
.
ืืืืืจื ืืช ืืืืฃ ืืขืืจืช ืจืืื ืืืคืืกืื ืกืื ืืจืืืื, ืืืืืช ื - 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}
ืืฉืจืช ืืืื ืืืชืืชืื ืืืืืืืืช (ืืืืจ ืืืืกืคืชื --reload
ืืคืงืืืช uvicorn
ืฉืืืขืื).
ืฉืืจืื ืืชืืขืื ืืืื ืืจืงืืืื¶
ืืขืช ืคื ื ืืืชืืืช http://127.0.0.1:8000/docs.
- ืืชืืขืื ืืืืืืืื ืืชืขืืื, ืืืื ืืืืฃ ืืืืฉ:
- ืืืฆื ืขื ืืืคืชืืจ "Try it out", ืืื ืืืคืฉืจ ืืื ืืืื ืืช ืืคืจืืืจืื ืืืขืืื ืืฉืืจืืช ืืื ื - API.
- ืืืจ ืื ืืืฆื ืขื ืืืคืชืืจ "Execute", ืืืชืจ ืืชืงืฉืจ ืขื ื - API ืฉืืื, ืืฉืื ืืช ืืคืจืืืจืื, ืืฉืื ืืช ืืชืืฆืืืช ืืื ืืจืื ืืืชื ืขื ืืืกื:
ืฉืืจืื ืืชืืขืื ืืืืืจื ืืืื¶
ืืขืช ืคื ื ืืืชืืืช http://127.0.0.1:8000/redoc.
- ืืชืืขืื ืืืืืจื ืืืื ืื ืืจืื ืืช ืคืจืืืจ ืืฉืืืืชื ืืืืืฃ ืืืืฉืื.
ืกืืืื¶
ืืกืืืื, ืืชื ืืืจืืืื ** ืคืขื ืืืช** ืขื ืืืคืืกื ืืคืจืืืจืื, ืืืฃ ืืื' ืืคืจืืืจืื ืืคืื ืงืฆืื.
ืืชื ืขืืฉืื ืืช ืื ืขื ืืืคืืกื ืคืืืชืื ืืืืจื ืืื.
ืืชื ืื ืฆืจืืืื ืืืืื ืชืืืืจ ืืืฉ, ืืชืืืืช ืื ืืืืงืืช ืฉื ืกืคืจืืื ืกืคืืฆืืคืืช, ืืื'
ืจืง ืคืืืชืื 3.6+ ืกืื ืืจืื.
ืืืืืื, ื - int
:
item_id: int
ืื ืืืืื Item
ืืืจืื ืืืชืจ:
item: Item
...ืืขื ืืืจืืช ืืืืคืืก ืืืืช ืืื ืืชื ืืงืืืื:
- ืชืืืืช ืขืืจื, ืืืื:
- ืืฉืืืืช.
- ืืืืงืช ืืืคืืกืื.
- ืืืืืช ืืืืข:
- ืฉืืืืืช ืืจืืจืืช ืืืืืืืืืช ืืืฉืจ ืืืื ืก ืืืืข ืื ืืืงื .
- ืืืืืช ืืคืืื ืืืืืืืงืื JSON ืืงืื ื ืื.
- ืืืจื ืฉื ืืืืข ืงืื: ืืืจื ืฉื ืืืืข ืฉืืืืข ืืืจืฉืช ืืืืืข ืืืืคืืกืื ืฉื ืคืืืชืื. ืงืืจื ื:
- JSON.
- ืคืจืืืจื ื ืชืื.
- ืคืจืืืจื ืฉืืืืชื.
- ืขืืืืืช.
- ืืืชืจืืช.
- ืืคืกืื.
- ืงืืฆืื.
- ืืืจื ืฉื ืืืืข ืคืื: ืืืจื ืฉื ืืืืข ืืืืคืืกืื ืืคืืืชืื ืืืืืข ืจืฉืช (ื - JSON):
- ืืืืจื ืืืคืืกื ืคืืืชืื (
str
,int
,float
,bool
,list
, etc). - ืขืฆืื
datetime
. - ืขืฆืื
UUID
. - ืืืืื ืืกืืกื ื ืชืื ืื.
- ...ืืจืืื ืืืจืื.
- ืืืืจื ืืืคืืกื ืคืืืชืื (
- ืชืืขืื API ืืืืืืื ืืืื ืืจืงืืืืืช ืืืื ืฉืชื ืืืืจื ืืืืืช ืืืืฉืง ืืืฉืชืืฉ:
- Swagger UI.
- ReDoc.
ืืืืจื ืืืืืืืช ืืงืื ืืงืืืืช, FastAPI ืืืื:
- ืืืืช ืฉืืฉ
item_id
ืื ืชืื ืืืงืฉืืชGET
ื -PUT
. - ืืืืช ืฉื -
item_id
ืืื ืืืืคืืกint
ืืืงืฉืืชGET
ื -PUT
.- ืื ืืื ืื, ืืืงืื ืืจืื ืฉืืืื ืืจืืจื ืืฉืืืืฉืืช.
- ืืืืืง ืืื ืงืืื ืคืจืืืจ ืฉืืืืชื ืืฉื
q
(ืงืจืhttp://127.0.0.1:8000/items/foo?q=somequery
) ืืืงืฉืืชGET
.- ืืืืจ ืืืคืจืืืจ
q
ืืืืืจ ืขื= None
, ืืื ืืืคืฆืืื ืื. - ืืืื ื -
None
ืืื ืืื ืืืื (ืืื ืืืืฃ ืืืงืจื ืฉืPUT
).
- ืืืืจ ืืืคืจืืืจ
- ืืืงืฉืืช
PUT
ืื ืชืื/items/{item_id}
, ืืงืจืื ืืช ืืืฃ ืืืงืฉื ื - JSON:- ืืืืช ืฉืืื ืืืื ืืช ืืืคืืื ืืืืื
name
ืฉืืืืจ ืืืืืช ืืืืคืืกstr
. - ืืืืช ืฉืืื ืืืื ืืช ืืืคืืื ืืืืื
price
ืฉืืืื ืืืืืช ืืืืคืืกfloat
. - ืืืืืง ืืื ืืื ืืืื ืืช ืืืคืืื ืืจืฉืืช
is_offer
ืฉืืืืจ ืืืืืช ืืืืคืืกbool
, ืื ืืื ื ืืฆื. - ืื ืื ืืขืืื ืื ืืืืืืืงื JSON ืืงืื ื.
- ืืืืช ืฉืืื ืืืื ืืช ืืืคืืื ืืืืื
- ืืืืืจ ื - JSON ืื- JSON ืืืืืืืืช.
- ืืชืขื ืืื ืืืืฆืขืืช OpenAPI, ืชืืขืื ืฉืื ืืืืื ืืืฉืชืืฉ:
- ืืขืจืืืช ืชืืขืื ืืื ืืจืงืืืืืืช.
- ืืขืจืืืช ืืืฆืืจ ืงืื ืืืืืืืืืช, ืืืจืื ืฉืคืืช.
- ืืกืคืง ืืฉืืจืืช ืฉืชื ืืขืจืืืช ืชืืขืื ืจืฉืชืืืช.
ืจืง ืืจืื ื ืืช ืงืฆื ืืงืจืืื, ืืื ืืืจ ืืฉ ืืื ืจืขืืื ืฉื ืืื ืืื ืขืืื.
ื ืกื ืืฉื ืืช ืืช ืืฉืืจื:
return {"item_name": item.name, "item_id": item_id}
...ื:
... "item_name": item.name ...
...ื:
... "item_price": item.price ...
...ืืจืื ืืื ืืขืืจื ืฉืืื ืืฉืืื ืืช ืืืืคืืื ืื ืืืืืข ืืช ืืืืคืืกืื ืฉืืื:
ืืืืืื ืืืชืจ ืฉืืื ืฉืืืืืช ืขืื ืชืืื ืืช, ืจืื ืืช ืืืืจืื - ืืืฉืชืืฉ.
ืืชืจืืช ืกืคืืืืจืื: ืืืืจืื - ืืืฉืชืืฉ ืืืื:
- ืืืจืื ืขื ืคืจืืืจืื ืืืงืืจืืช ืืืจืื ืืฉืื ืื ืืืื: ืืืชืจืืช, ืขืืืืืช, ืืคืกืื ื - ืงืืฆืื.
- ืืื ืืงืืืข ืืืืืืช ืืืืืช ืืขืืจืช
maximum_length
ืืregex
. - ืืจื ืืืงื ืืงืื ืืืฉืชืืฉ ืืืืจืงืช ืชืืืืืช.
- ืืืืื ืืืชืืืชืืช, ืืืื ืชืืืื ื - OAuth2 ืขื JWT ืืืชืืืชืืช HTTP Basic.
- ืืื ืืงืืช ืืชืงืืืืช (ืืื ืงืืืช ืืืืชื ืืืื) ืืืืจืืช ืืืืืืงืื JSON ืืงืื ื ืื (ืชืืืืช ื - Pydantic).
- ืืื ืืจืงืฆืื ืขื GraphQL ืืจื Strawberry ืืกืคืจืืืช ืืืจืืช.
- ืชืืื ืืช ื ืืกืคืืช ืจืืืช (ืชืืืืช ื - Starlette) ืืืื:
- WebSockets
- ืืืืงืืช ืงืืืช ืืืืืื ืืืืกืกืืช ืขื
requests
ื -pytest
- CORS
- Cookie Sessions
- ...ืืขืื.
ืืืฆืืขืื¶
ืืืืงืืช ืขืฆืืืืืช ืฉื TechEmpower ืืจืื ืฉืืคืืืงืฆืืืช FastAPI ืฉืจืฆืืช ืชืืช Uvicorn ืื ืืชืฉืชืืืช ืืคืืืชืื ืืืืืจืืช ืืืืชืจ, ืจืง ืืชืืช ื - Starlette ื - Uvicorn ืขืฆืื (ืฉ - FastAPI ืืืืกืกืช ืขืืืื). (*)
ืืื ืืืืื ืขืื ืขื ืื ืืฉื, ืจืื ืืช ืืคืจืง Benchmarks.
ืชืืืืืช ืืืคืฆืืื ืืืืช¶
ืืฉืืืืฉ Pydantic:
email_validator
- ืืืืืืช ืืชืืืืช ืืืืืื.
ืืฉืืืืฉ Starlette:
httpx
- ืืจืืฉ ืื ืืจืฆืื ืื ืืืฉืชืืฉ ื -TestClient
.jinja2
- ืืจืืฉ ืื ืืจืฆืื ืื ืืืฉืชืืฉ ืืืจืืจืช ืืืืื ืฉื ืชืฆืืจืช ืืืืคืืืืืื.python-multipart
- ืืจืืฉ ืื ืืจืฆืื ืื ืืชืืื ื "ืคืจืกืืจ" ืืคืกืื, ืืืฆืืขืืชrequest.form()
.itsdangerous
- ืืจืืฉ ืื ืืจืฆืื ืื ืืืฉืชืืฉ ื -SessionMiddleware
.pyyaml
- ืืจืืฉ ืื ืืจืฆืื ืื ืืืฉืชืืฉ ื -SchemaGenerator
ืฉื Starlette (ืื ืจืื ืฉืืชื ืื ืฆืจืืืื ืืช ืื ืขื FastAPI).ujson
- ืืจืืฉ ืื ืืจืฆืื ืื ืืืฉืชืืฉ ื -UJSONResponse
.
ืืฉืืืืฉ FastAPI / Starlette:
uvicorn
- ืืฉืจืช ืฉืืืขื ืืืืืฉ ืืช ืืืคืืืงืฆืื ืฉืืื.orjson
- ืืจืืฉ ืื ืืจืฆืื ืื ืืืฉืชืืฉ ื -ORJSONResponse
.
ืชืืืื ืืืชืงืื ืืช ืื ืืื ืืืืฆืขืืช pip install "fastapi[all]"
.
ืจืฉืืื¶
ืืคืจืืืงื ืืื ืืื ืชืืช ืืชื ืืื ืฉื ืจืฉืืื MIT.