跳到內容

FastAPI

FastAPI

FastAPI 框架,高效能,易於學習,快速編碼,生產就緒

Test Coverage Package version Supported Python versions


文件: https://fastapi.python.club.tw

原始碼: https://github.com/fastapi/fastapi


FastAPI 是一個現代、快速(高效能)的 Web 框架,用於基於標準 Python 型別提示構建 API。

主要特性包括:

  • 快速:效能極高,與 NodeJSGo 不相上下(得益於 Starlette 和 Pydantic)。它是現有的最快 Python 框架之一
  • 快速編碼:將開發速度提高約 200% 到 300%。 *
  • 更少 Bug:減少約 40% 的人為(開發者)導致錯誤。 *
  • 直觀:出色的編輯器支援。隨處可見的程式碼補全。減少除錯時間。
  • 簡單:設計易於使用和學習。減少閱讀文件的時間。
  • 簡短:最大限度地減少程式碼重複。從每個引數宣告中獲取多個特性。減少 Bug。
  • 健壯:獲取生產就緒的程式碼。並帶有自動互動式文件。
  • 基於標準:基於(並完全相容)API 的開放標準:OpenAPI(原名 Swagger)和 JSON Schema

* 評估基於內部開發團隊在構建生產應用時進行的測試。

贊助商

基石贊助商

FastAPI Cloud. By the same team behind FastAPI. You code. We Cloud.

黃金贊助商

BlockBee Cryptocurrency Payment Gateway Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files Auth, user management and more for your B2B product liblab - Generate SDKs from FastAPI Deploy & scale any full-stack web app on Render. Focus on building apps, not infra. Cut Code Review Time & Bugs in Half with CodeRabbit The Gold Standard in Retail Account Linking Deploy enterprise applications at startup speed SerpApi: Web Search API Greptile: The AI Code Reviewer

白銀贊助商

Pay as you go for market data Svix - Webhooks as a service Stainless | Generate best-in-class SDKs Fine-Grained Authorization for FastAPI InterviewPal - AI Interview Coach for Engineers and Devs Dribia - Data Science within your reach TalorData SERP API - Multi-Engine Search Results Data

其他贊助商

評價

“我最近大量使用 FastAPI。我實際上計劃將它用於我團隊在 Microsoft 的所有 ML 服務中。其中一些正在整合到核心 Windows 產品和一些 Office 產品中。”
— Kabir Khan, Microsoft (ref)

[...] 我最近大量使用 FastAPI。 [...] 我實際上計劃將它用於我團隊在 Microsoft 的所有 ML 服務中。其中一些正在整合到核心 Windows 產品和一些 Office 產品中。

Kabir Khan - Microsoft (ref)

我們採用了 FastAPI 庫來生成一個 REST 伺服器,可以透過查詢它來獲取 預測結果。[針對 Ludwig]

Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)

Netflix 很高興宣佈開源釋出我們的 危機管理 編排框架:Dispatch![基於 FastAPI 構建]

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)

如果有人想構建生產環境的 Python API,我強烈推薦 FastAPI。它 設計精美使用簡單高度可擴充套件,它已成為我們以 API 為先的開發策略中的 關鍵元件,並驅動了許多自動化和服務,例如我們的虛擬 TAC 工程師。

Deon Pillsbury - Cisco (ref)

FastAPI Conf

FastAPI Conf '26 將於 2026 年 10 月 28 日荷蘭阿姆斯特丹 舉行。所有關於 FastAPI 的內容,一手資訊。 🎤

FastAPI Conf '26 - October 28, 2026 - Amsterdam, NL

FastAPI 迷你紀錄片

2025 年底釋出了一部 FastAPI 迷你紀錄片,你可以線上觀看

FastAPI Mini Documentary

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}

注意:

如果你不確定,請檢視文件中關於 asyncawait 的“匆忙嗎?”部分

執行它

使用以下命令執行伺服器:

$ 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 提供)

Swagger UI

替代 API 文件

現在,訪問 http://127.0.0.1:8000/redoc

你將看到替代性的自動文件(由 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

Swagger UI

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

Swagger UI interaction

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

Swagger UI interaction

替代 API 文件升級

現在,訪問 http://127.0.0.1:8000/redoc

  • 替代文件也將反映新的查詢引數和 body

ReDoc

回顧

總而言之,你只需將引數、body 等的型別作為函式引數宣告一次

你使用標準的現代 Python 型別來完成此操作。

你無需學習新的語法、特定庫的方法或類等。

只需標準的 Python

例如,對於一個 int

item_id: int

或者對於一個更復雜的 Item 模型

item: Item

...透過這一項宣告,你就能獲得:

  • 編輯器支援,包括:
    • 補全。
    • 型別檢查。
  • 資料驗證
    • 當資料無效時,自動且清晰的錯誤提示。
    • 即使是深層巢狀的 JSON 物件也能進行驗證。
  • 轉換 輸入資料:從網路傳輸的原始資料轉換為 Python 資料和型別。讀取自:
    • JSON。
    • 路徑引數。
    • 查詢引數。
    • Cookie。
    • 請求頭。
    • 表單。
    • 檔案。
  • 轉換 輸出資料:將 Python 資料和型別轉換為網路資料(以 JSON 格式)
    • 轉換 Python 型別(str, int, float, bool, list 等)。
    • datetime 物件。
    • UUID 物件。
    • 資料庫模型。
    • ...以及更多。
  • 自動互動式 API 文件,包括 2 種替代使用者介面:
    • Swagger UI。
    • ReDoc。

回到之前的程式碼示例,FastAPI 將:

  • 驗證 GETPUT 請求的路徑中是否存在 item_id
  • 驗證 GETPUT 請求的 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 ...

...然後看看你的編輯器將如何自動補全屬性並知曉它們的型別

editor support

要檢視包含更多功能的完整示例,請參閱 教程 - 使用者指南

劇透警告:教程 - 使用者指南包括

  • 從不同位置宣告 引數,如:HeaderCookie表單欄位檔案
  • 如何設定 驗證約束,如 maximum_lengthregex
  • 一個功能極其強大且易於使用的 依賴注入 系統。
  • 安全性和身份驗證,包括對帶有 JWT 令牌OAuth2HTTP 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 CloudFastAPI 背後的作者和團隊構建。

它以最小的努力簡化了 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 使用:

由 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 依賴項:

額外的可選 FastAPI 依賴項:

  • orjson - 如果你想使用 ORJSONResponse,則必需。
  • ujson - 如果你想使用 UJSONResponse,則必需。

許可協議

本專案基於 MIT 許可協議授權。