測驗:為什麼選擇 FastAPI?
共 5 題,點選答案後會立即顯示結果
1. FastAPI 自動產生的 API 文件可以在哪個路徑存取?
2. 在 FastAPI 中,BaseModel 是從哪個套件匯入的?
3. 當使用者傳入錯誤型別的參數時,FastAPI 會自動回傳什麼 HTTP 狀態碼?
4. 以下哪個是 Flask 與 FastAPI 的關鍵差異?
5. 在 FastAPI 專案中看到 APIRouter 通常表示什麼?
前言
當你使用 AI 輔助開發 Python 後端專案時,經常會看到 AI 建議使用 FastAPI。這篇文章幫助你理解 FastAPI 的核心優勢,以及為什麼它成為現代 Python API 開發的熱門選擇。
FastAPI 是什麼?
FastAPI 是一個現代的 Python Web 框架,專門設計用來建構 API。它的名字就說明了兩個核心特點:Fast(快速)和 API(專注於 API 開發)。
來看一個最簡單的 FastAPI 應用:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello World"}
Code language: JavaScript (javascript)這段程式碼做了什麼:
FastAPI()建立應用程式實例@app.get("/")裝飾器定義了一個 GET 請求的路由- 函式直接回傳 Python 字典,FastAPI 自動轉換為 JSON
核心優勢一:自動產生 API 文件
FastAPI 最吸引人的特色是自動產生互動式 API 文件。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
當你讀到這樣的程式碼時,注意:
BaseModel– 來自 Pydantic,用於定義資料結構- 型別標註 –
name: str表示 name 必須是字串 - 預設值 –
is_offer: bool = False表示此欄位可選
啟動伺服器後,訪問 /docs 就能看到 Swagger UI 文件,訪問 /redoc 則是 ReDoc 格式。這些文件會根據你的程式碼自動更新,不需要額外維護。
核心優勢二:型別提示與自動驗證
FastAPI 充分利用 Python 的型別提示(Type Hints):
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
Code language: JavaScript (javascript)這段程式碼告訴我們:
item_id: int– 路徑參數,必須是整數q: str = None– 查詢參數,可選的字串
如果使用者傳入 /items/abc,FastAPI 會自動回傳 422 錯誤,告知 item_id 必須是整數。你不需要寫任何驗證程式碼。
核心優勢三:原生非同步支援
FastAPI 原生支援 Python 的 async/await:
@app.get("/async-items/")
async def read_items():
results = await some_async_operation()
return results
Code language: JavaScript (javascript)注意 async def 和 await 關鍵字。這讓 FastAPI 在處理 I/O 密集型操作(如資料庫查詢、外部 API 呼叫)時效能特別好。
但也支援同步函式:
@app.get("/sync-items/")
def read_items():
return {"items": ["item1", "item2"]}
Code language: JavaScript (javascript)你可以根據需求選擇同步或非同步寫法。
與其他框架比較
Flask
Flask 是輕量級框架,你可能會看到這樣的程式碼:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/items/<int:item_id>")
def read_item(item_id):
return jsonify({"item_id": item_id})
Code language: JavaScript (javascript)Flask vs FastAPI 關鍵差異:
- Flask 沒有內建型別驗證,需要手動處理
- Flask 沒有自動產生 API 文件
- Flask 預設不支援 async(需要額外設定)
Django REST Framework
Django 是全功能框架,適合建構完整的 Web 應用:
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['GET'])
def read_item(request, item_id):
return Response({"item_id": item_id})
Code language: JavaScript (javascript)Django REST Framework vs FastAPI:
- Django 功能完整但較為複雜
- Django 有內建 ORM、Admin 介面、認證系統
- FastAPI 更輕量、專注於 API 開發
選擇框架的判斷依據
看到專案使用不同框架時,可以這樣理解選擇原因:
| 場景 | 推薦框架 | 原因 |
|---|---|---|
| 純 API 服務 | FastAPI | 效能好、自動文件 |
| 微服務架構 | FastAPI | 輕量、容易部署 |
| ML 模型部署 | FastAPI | async 支援、效能優異 |
| 需要 Admin 後台 | Django | 內建功能完整 |
| 已有 Flask 專案 | Flask | 維護成本考量 |
| 簡單原型開發 | Flask 或 FastAPI | 兩者都適合 |
實際專案識別
當你閱讀 FastAPI 專案時,注意這些常見模式:
# 專案入口通常命名為 main.py
from fastapi import FastAPI
app = FastAPI(
title="My API",
description="API 說明文件",
version="1.0.0"
)
# 分模組時會使用 APIRouter
from fastapi import APIRouter
router = APIRouter(prefix="/users", tags=["users"])
Code language: PHP (php)看到 APIRouter 表示專案採用模組化結構,類似 Flask 的 Blueprint。
小結
FastAPI 的設計理念是:用最少的程式碼,獲得最大的功能。它結合了:
- 高效能 – 基於 Starlette 和 Pydantic
- 開發者體驗 – 自動文件、型別提示、編輯器支援
- 現代化 – 原生 async 支援、符合 OpenAPI 標準
當你看到專案使用 FastAPI,通常意味著這是一個專注於 API 開發、重視效能和開發效率的現代 Python 專案。
延伸閱讀
- FastAPI 官方文件
- 下一篇:【FastAPI 教學】#02 第一個 FastAPI 應用
進階測驗:為什麼選擇 FastAPI?
共 5 題,包含情境題與錯誤診斷題。