【FastAPI 教學】#01 為什麼選擇 FastAPI?

測驗:為什麼選擇 FastAPI?

共 5 題,點選答案後會立即顯示結果

1. FastAPI 自動產生的 API 文件可以在哪個路徑存取?

  • A. /api-docs/swagger
  • B. /docs/redoc
  • C. /documentation/spec
  • D. /openapi/schema

2. 在 FastAPI 中,BaseModel 是從哪個套件匯入的?

  • A. fastapi
  • B. starlette
  • C. pydantic
  • D. typing

3. 當使用者傳入錯誤型別的參數時,FastAPI 會自動回傳什麼 HTTP 狀態碼?

@app.get(“/items/{item_id}”) def read_item(item_id: int): return {“item_id”: item_id} # 使用者存取 /items/abc
  • A. 400 Bad Request
  • B. 404 Not Found
  • C. 500 Internal Server Error
  • D. 422 Unprocessable Entity

4. 以下哪個是 Flask 與 FastAPI 的關鍵差異?

  • A. Flask 支援 async,FastAPI 不支援
  • B. FastAPI 有自動型別驗證和 API 文件,Flask 沒有內建
  • C. Flask 效能比 FastAPI 更好
  • D. FastAPI 有內建 ORM,Flask 沒有

5. 在 FastAPI 專案中看到 APIRouter 通常表示什麼?

from fastapi import APIRouter router = APIRouter(prefix=”/users”, tags=[“users”])
  • A. 這是用來處理資料庫連線的元件
  • B. 這是用來處理認證的中間件
  • C. 專案採用模組化結構,類似 Flask 的 Blueprint
  • D. 這是用來定義 WebSocket 連線的元件

前言

當你使用 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}

當你讀到這樣的程式碼時,注意:

  1. BaseModel – 來自 Pydantic,用於定義資料結構
  2. 型別標註name: str 表示 name 必須是字串
  3. 預設值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 defawait 關鍵字。這讓 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 的設計理念是:用最少的程式碼,獲得最大的功能。它結合了:

  1. 高效能 – 基於 Starlette 和 Pydantic
  2. 開發者體驗 – 自動文件、型別提示、編輯器支援
  3. 現代化 – 原生 async 支援、符合 OpenAPI 標準

當你看到專案使用 FastAPI,通常意味著這是一個專注於 API 開發、重視效能和開發效率的現代 Python 專案。


延伸閱讀

進階測驗:為什麼選擇 FastAPI?

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你正在開發一個需要頻繁呼叫外部 API 的微服務,團隊討論要選擇哪個框架。根據文章內容,以下哪個選擇最合適? 情境題

  • A. Django REST Framework,因為功能完整
  • B. FastAPI,因為原生支援 async 且效能優異
  • C. Flask,因為最輕量
  • D. Django,因為有內建 ORM

2. 同事寫了以下 FastAPI 程式碼,但 API 文件中沒有顯示請求參數的型別資訊。可能的原因是什麼? 錯誤診斷

from fastapi import FastAPI app = FastAPI() @app.post(“/items/”) def create_item(item): return {“received”: item}
  • A. 沒有匯入 pydantic
  • B. 應該使用 @app.get 而非 @app.post
  • C. 參數 item 沒有型別標註,FastAPI 無法推斷結構
  • D. FastAPI() 需要額外設定才能產生文件

3. 你接手一個專案,需要建立需要 Admin 後台管理介面的內部系統,同時也需要提供 API。根據文章的框架比較,你會如何建議? 情境題

  • A. 使用 FastAPI,因為效能最好
  • B. 使用 Flask,因為最容易上手
  • C. 使用 FastAPI 搭配自己開發 Admin 介面
  • D. 使用 Django,因為有內建 Admin 介面和完整功能

4. 新進同事看到以下程式碼感到困惑,問你為什麼 is_offer 參數可以不傳。你會如何解釋? 錯誤診斷

from pydantic import BaseModel class Item(BaseModel): name: str price: float is_offer: bool = False
  • A. bool 型別的參數預設都是可選的
  • B. is_offer: bool = False 設定了預設值,使此欄位變成可選
  • C. Pydantic 會自動將所有參數設為可選
  • D. FastAPI 會忽略布林型別的驗證

5. 你要部署一個機器學習模型作為 API 服務,預期會有大量並發請求。根據文章的選擇判斷依據,最適合的框架是? 情境題

  • A. FastAPI,因為 async 支援和效能優異適合 ML 模型部署
  • B. Django REST Framework,因為功能完整
  • C. Flask,因為簡單原型開發適合
  • D. 以上皆可,差異不大

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *