FastAPI¶
FastAPI 框架,高效能,易於學習,快速編碼,生產就緒
文件: https://fastapi.python.club.tw
原始碼: https://github.com/fastapi/fastapi
FastAPI 是一個現代、快速(高效能)的 Web 框架,用於基於標準 Python 型別提示構建 API。
主要特性包括:
- 快速:效能極高,與 NodeJS 和 Go 不相上下(得益於 Starlette 和 Pydantic)。它是現有的最快 Python 框架之一。
- 快速編碼:將開發速度提高約 200% 到 300%。 *
- 更少 Bug:減少約 40% 的人為(開發者)導致錯誤。 *
- 直觀:出色的編輯器支援。隨處可見的程式碼補全。減少除錯時間。
- 簡單:設計易於使用和學習。減少閱讀文件的時間。
- 簡短:最大限度地減少程式碼重複。從每個引數宣告中獲取多個特性。減少 Bug。
- 健壯:獲取生產就緒的程式碼。並帶有自動互動式文件。
- 基於標準:基於(並完全相容)API 的開放標準:OpenAPI(原名 Swagger)和 JSON Schema。
* 評估基於內部開發團隊在構建生產應用時進行的測試。
贊助商¶
基石贊助商¶
黃金贊助商¶
白銀贊助商¶
評價¶
“我最近大量使用 FastAPI。我實際上計劃將它用於我團隊在 Microsoft 的所有 ML 服務中。其中一些正在整合到核心 Windows 產品和一些 Office 產品中。”
“我們採用了 FastAPI 庫來生成一個 REST 伺服器,可以透過查詢它來獲取 預測結果。” [針對 Ludwig]
“Netflix 很高興宣佈開源釋出我們的 危機管理 編排框架:Dispatch!” [基於 FastAPI 構建]
“如果有人想構建生產環境的 Python API,我強烈推薦 FastAPI。它 設計精美,使用簡單 且 高度可擴充套件 —— 它已成為我們以 API 為先的開發策略中的 關鍵元件。”
“[...] 我最近大量使用 FastAPI。 [...] 我實際上計劃將它用於我團隊在 Microsoft 的所有 ML 服務中。其中一些正在整合到核心 Windows 產品和一些 Office 產品中。”
“我們採用了 FastAPI 庫來生成一個 REST 伺服器,可以透過查詢它來獲取 預測結果。[針對 Ludwig]”
“Netflix 很高興宣佈開源釋出我們的 危機管理 編排框架:Dispatch![基於 FastAPI 構建]”
“如果有人想構建生產環境的 Python API,我強烈推薦 FastAPI。它 設計精美,使用簡單 且 高度可擴充套件,它已成為我們以 API 為先的開發策略中的 關鍵元件,並驅動了許多自動化和服務,例如我們的虛擬 TAC 工程師。”
FastAPI Conf¶
FastAPI Conf '26 將於 2026 年 10 月 28 日 在 荷蘭阿姆斯特丹 舉行。所有關於 FastAPI 的內容,一手資訊。 🎤
FastAPI 迷你紀錄片¶
2025 年底釋出了一部 FastAPI 迷你紀錄片,你可以線上觀看
Typer,命令列介面(CLI)的 FastAPI¶
如果你正在構建一個用於終端的 CLI 應用而不是 Web API,請看看 Typer。
Typer 是 FastAPI 的小兄弟。它的目標就是成為 命令列介面(CLI)的 FastAPI。 ⌨️ 🚀
要求¶
FastAPI 站在巨人的肩膀上
安裝¶
建立並激活一個 虛擬環境,然後安裝 FastAPI
$ pip install "fastapi[standard]"
---> 100%
注意:請確保將 "fastapi[standard]" 放在引號中,以確保它在所有終端中都能正常工作。
示例¶
建立它¶
建立一個檔案 main.py,內容如下:
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: str | None = None):
return {"item_id": item_id, "q": q}
或者使用 async def...
如果你的程式碼使用 async / await,請使用 async def
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: str | None = None):
return {"item_id": item_id, "q": q}
注意:
如果你不確定,請檢視文件中關於 async 和 await 的“匆忙嗎?”部分。
執行它¶
使用以下命令執行伺服器:
$ fastapi dev
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
│ Serving at: http://127.0.0.1:8000 │
│ │
│ API docs: http://127.0.0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [2248755] using WatchFiles
INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.
關於命令 fastapi dev...
命令 fastapi dev 會自動讀取你的 main.py 檔案,檢測其中的 FastAPI 應用,並使用 Uvicorn 啟動伺服器。
預設情況下,fastapi dev 會啟動並啟用自動過載,方便本地開發。
你可以在 FastAPI CLI 文件 中閱讀更多相關資訊。
檢查一下¶
在瀏覽器中開啟 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}包含一個 路徑引數item_id,它應該是一個int。 - 路徑
/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 提供)

升級示例¶
現在修改 main.py 檔案,以接收來自 PUT 請求的 body。
得益於 Pydantic,使用標準 Python 型別宣告 body。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool | None = None
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: 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}
fastapi dev 伺服器應該會自動過載。
互動式 API 文件升級¶
現在訪問 http://127.0.0.1:8000/docs。
- 互動式 API 文件將自動更新,包括新的 body

- 點選“Try it out”按鈕,它允許你填寫引數並直接與 API 互動

- 然後點選“Execute”按鈕,使用者介面將與你的 API 通訊,傳送引數,獲取結果並將其顯示在螢幕上

替代 API 文件升級¶
現在,訪問 http://127.0.0.1:8000/redoc。
- 替代文件也將反映新的查詢引數和 body

回顧¶
總而言之,你只需將引數、body 等的型別作為函式引數宣告一次。
你使用標準的現代 Python 型別來完成此操作。
你無需學習新的語法、特定庫的方法或類等。
只需標準的 Python。
例如,對於一個 int
item_id: int
或者對於一個更復雜的 Item 模型
item: Item
...透過這一項宣告,你就能獲得:
- 編輯器支援,包括:
- 補全。
- 型別檢查。
- 資料驗證
- 當資料無效時,自動且清晰的錯誤提示。
- 即使是深層巢狀的 JSON 物件也能進行驗證。
- 轉換 輸入資料:從網路傳輸的原始資料轉換為 Python 資料和型別。讀取自:
- JSON。
- 路徑引數。
- 查詢引數。
- Cookie。
- 請求頭。
- 表單。
- 檔案。
- 轉換 輸出資料:將 Python 資料和型別轉換為網路資料(以 JSON 格式)
- 轉換 Python 型別(
str,int,float,bool,list等)。 datetime物件。UUID物件。- 資料庫模型。
- ...以及更多。
- 轉換 Python 型別(
- 自動互動式 API 文件,包括 2 種替代使用者介面:
- 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請求中的 body 一樣)。
- 由於
- 對於傳送到
/items/{item_id}的PUT請求,以 JSON 格式讀取 body- 檢查它是否具有必需的屬性
name,且型別為str。 - 檢查它是否具有必需的屬性
price,且型別為float。 - 檢查它是否具有可選的屬性
is_offer,如果存在,則型別為bool。 - 所有這些對於深層巢狀的 JSON 物件同樣有效。
- 檢查它是否具有必需的屬性
- 自動進行 JSON 的序列化和反序列化。
- 使用 OpenAPI 對所有內容進行文件化,該標準可用於:
- 互動式文件系統。
- 適用於多種語言的自動客戶端程式碼生成系統。
- 直接提供 2 種互動式 API 文件 Web 介面。
我們只是觸及了表面,但你已經瞭解了它的工作原理。
嘗試更改以下程式碼行:
return {"item_name": item.name, "item_id": item_id}
...從
... "item_name": item.name ...
...改為
... "item_price": item.price ...
...然後看看你的編輯器將如何自動補全屬性並知曉它們的型別

要檢視包含更多功能的完整示例,請參閱 教程 - 使用者指南。
劇透警告:教程 - 使用者指南包括
- 從不同位置宣告 引數,如:Header、Cookie、表單欄位 和 檔案。
- 如何設定 驗證約束,如
maximum_length或regex。 - 一個功能極其強大且易於使用的 依賴注入 系統。
- 安全性和身份驗證,包括對帶有 JWT 令牌 的 OAuth2 和 HTTP Basic 認證的支援。
- 用於宣告 深層巢狀 JSON 模型 的更高階(但同樣簡單)技術(得益於 Pydantic)。
- 透過 Strawberry 和其他庫實現 GraphQL 整合。
- (得益於 Starlette)的許多額外功能,例如:
- WebSockets
- 基於 HTTPX 和
pytest的極其簡單的測試 - CORS
- Cookie Session
- ...等等。
部署你的應用(可選)¶
你可以選擇將你的 FastAPI 應用部署到 FastAPI Cloud,如果還沒加入等待名單,快去加入吧。 🚀
如果你已經擁有 FastAPI Cloud 帳戶(我們已邀請你加入等待名單 😉),你可以使用一條命令部署你的應用程式。
$ fastapi deploy
Deploying to FastAPI Cloud...
✅ Deployment successful!
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
就是這樣!現在你可以在那個 URL 訪問你的應用了。✨
關於 FastAPI Cloud¶
FastAPI Cloud 由 FastAPI 背後的作者和團隊構建。
它以最小的努力簡化了 API 的構建、部署和訪問過程。
它將使用 FastAPI 構建應用的開發者體驗帶到了將它們部署到雲端的過程中。🎉
FastAPI Cloud 是 FastAPI 及其相關開源專案的主要贊助商和資金提供者。✨
部署到其他雲提供商¶
FastAPI 是開源的並且基於標準。你可以將 FastAPI 應用部署到你選擇的任何雲服務提供商。
遵循你的雲服務提供商的指南來部署 FastAPI 應用。🤓
效能¶
獨立的 TechEmpower 基準測試顯示,在 Uvicorn 下執行的 FastAPI 應用程式是 現有的最快 Python 框架之一,僅次於 Starlette 和 Uvicorn 本身(由 FastAPI 內部使用)。 (*)
要深入瞭解,請參閱 基準測試 部分。
依賴¶
FastAPI 依賴於 Pydantic 和 Starlette。
standard 依賴¶
當你使用 pip install "fastapi[standard]" 安裝 FastAPI 時,它會附帶 standard 組的可選依賴項:
由 Pydantic 使用:
email-validator- 用於電子郵件驗證。
由 Starlette 使用:
httpx- 如果你想使用TestClient,則必需。jinja2- 如果你想使用預設模板配置,則必需。python-multipart- 如果你想支援使用request.form()進行表單 “解析”,則必需。
由 FastAPI 使用:
uvicorn- 用於載入和提供你的應用程式的伺服器。這包括uvicorn[standard],它包含了高效能服務所需的一些依賴項(例如uvloop)。fastapi-cli[standard]- 用於提供fastapi命令。- 這包括
fastapi-cloud-cli,它允許你將 FastAPI 應用程式部署到 FastAPI Cloud。
- 這包括
不使用 standard 依賴¶
如果你不想包含 standard 可選依賴項,可以使用 pip install fastapi 而不是 pip install "fastapi[standard]" 來進行安裝。
不使用 fastapi-cloud-cli¶
如果你想在安裝 FastAPI 時包含標準依賴項,但排除 fastapi-cloud-cli,可以使用 pip install "fastapi[standard-no-fastapi-cloud-cli]" 進行安裝。
其他可選依賴¶
還有一些你可能需要安裝的額外依賴項。
額外的可選 Pydantic 依賴項:
pydantic-settings- 用於設定管理。pydantic-extra-types- 用於與 Pydantic 一起使用的額外型別。
額外的可選 FastAPI 依賴項:
許可協議¶
本專案基於 MIT 許可協議授權。















