跳至主要内容

2 篇文章 含有標籤「FastAPI」

檢視所有標籤

Django、Flask、FastAPI 吞吐量比較入門教學筆記 | 學習筆記

· 閱讀時間約 4 分鐘
kdchang

前言

在 Python Web 開發領域,Django、Flask 與 FastAPI 是三個非常熱門且廣泛使用的框架。它們各有特點與適用場景,但在性能表現,特別是吞吐量(throughput)方面,存在一定差異。吞吐量通常指每秒鐘能處理的請求數量,是衡量 Web 框架在高併發環境中效率的重要指標。

本篇筆記將簡要介紹這三個框架的基本架構與設計理念,並透過簡單測試與範例比較其吞吐量,幫助初學者理解如何依需求選擇適合的框架。


重點摘要

  • Django

    • 全功能、重量級框架,內建 ORM、管理後台、驗證系統等
    • 同步同步處理,基於 WSGI,預設不支援非同步(Asynchronous)請求
    • 適合需要完整解決方案的中大型專案
    • 吞吐量相較較低,因同步阻塞限制高併發能力
  • Flask

    • 輕量級框架,核心簡單,擴展彈性高
    • 同樣基於同步 WSGI,預設不支援非同步
    • 適合小型、原型開發及彈性需求較多的專案
    • 吞吐量與 Django 相近,瓶頸多來自同步阻塞與部署環境
  • FastAPI

    • 新興的輕量且高性能框架,採用 ASGI 標準,內建非同步支援
    • 基於 Starlette 與 Pydantic,支援非同步 I/O,大幅提升吞吐量
    • 適合高併發、API 開發需求強烈的專案
    • 吞吐量明顯優於 Django、Flask,適合現代微服務架構
  • 吞吐量測試環境與結果

    • 使用同一台機器與相同測試工具(如 wrkabLocust)對簡單 API 進行測試
    • Django、Flask 在同步阻塞環境吞吐量約數千至上萬請求/秒
    • FastAPI 在非同步環境可突破十萬請求/秒,具備更好擴展性
  • 部署差異

    • Django、Flask 多搭配 Gunicorn(WSGI)同步服務器部署
    • FastAPI 搭配 Uvicorn、Hypercorn(ASGI)非同步服務器,性能最佳化

吞吐量比較實際範例

以下將以簡單「Hello World」API 為例,展示三個框架的基本實作,並提供吞吐量測試方法參考。

1. Django 範例

程式碼(views.py):

from django.http import JsonResponse

def hello(request):
return JsonResponse({"message": "Hello World"})

URL 設定(urls.py):

from django.urls import path
from .views import hello

urlpatterns = [
path('hello/', hello),
]

啟動方式:

python manage.py runserver

(正式部署可用 Gunicorn)

2. Flask 範例

程式碼(app.py):

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/hello')
def hello():
return jsonify(message="Hello World")

if __name__ == "__main__":
app.run()

啟動方式:

python app.py

(正式部署可用 Gunicorn)

3. FastAPI 範例

程式碼(main.py):

from fastapi import FastAPI

app = FastAPI()

@app.get("/hello")
async def hello():
return {"message": "Hello World"}

啟動方式:

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

吞吐量測試方法簡介

使用 Linux 下的 wrk 工具對三個 API 進行測試:

若使用 Mac 作業系統可以安裝:

brew install wrk

下指令測試:

wrk -t4 -c100 -d30s http://localhost:8000/hello
  • -t4:4 個 thread
  • -c100:100 個持續連線
  • -d30s:測試持續 30 秒

測試結果可觀察 Requests/sec 欄位,即為吞吐量。


性能分析與比較

  • Django 在簡單請求下可達數千請求/秒,但因同步處理與較重的框架開銷,無法輕易擴展至高併發環境。
  • Flask 同樣是同步,吞吐量略優於 Django,但主要瓶頸仍在同步阻塞與伺服器資源分配。
  • FastAPI 採用非同步設計,利用 Python 的 async/await 及高效事件迴圈,能在相同硬體資源下達到數倍甚至十倍以上吞吐量,尤其適合 I/O 密集型服務。

總結

選擇適合的 Python Web 框架時,需根據專案規模、功能需求及預期流量做權衡。Django 適合快速搭建大型且功能完整的應用,Flask 適合靈活開發與小型專案,而 FastAPI 則是現代高效能 API 開發的首選。

在吞吐量需求高、需要非同步處理的情境下,FastAPI 明顯優勢突出。未來隨著非同步技術普及,FastAPI 的應用範圍將持續擴大。

參考文件

  1. locust 官方文件

FastAPI 入門教學筆記:打造現代 Python Web API 的入門教學筆記 | 學習筆記

· 閱讀時間約 3 分鐘
kdchang

什麼是 FastAPI?

FastAPI 是一個現代、快速(高效能)、基於 Python 3.7+ 類型提示的 Web 框架,用於建構 API。其核心優勢包含:

  • 自動生成文件:內建 OpenAPI 與 Swagger UI 支援
  • 高效能:基於 Starlette 和 Pydantic,效能可媲美 Node.js 與 Go
  • 開發快速:強大的 IDE 支援與自動補全功能
  • 自動驗證與序列化:透過 Pydantic 型別自動完成

FastAPI 適合快速構建 RESTful API,尤其在開發微服務、機器學習模型部署、或任何 API 後端都非常合適。


快速開始:環境準備與安裝

建議使用虛擬環境管理專案依賴。

python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install fastapi uvicorn
  • fastapi:核心框架
  • uvicorn:ASGI Server,用來啟動應用程式

第一個 FastAPI 程式:Hello API

# main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}

啟動應用程式:

uvicorn main:app --reload
  • --reload:啟用熱重載,開發時會自動重新載入程式

訪問 http://127.0.0.1:8000/,你會看到:

{
"message": "Hello, FastAPI!"
}

自動生成的互動式 API 文件

FastAPI 自動提供兩個 API 文件頁面:

  • Swagger UI:http://127.0.0.1:8000/docs
  • Redoc:http://127.0.0.1:8000/redoc

這些文件會根據程式中的路由與型別提示自動生成,方便前後端協作與測試。


使用路由參數與查詢參數

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}

範例請求:

GET /items/42?q=fastapi

回應結果:

{
"item_id": 42,
"q": "fastapi"
}
  • item_id 是路由參數,會自動轉換為 int
  • q 是查詢參數,預設為 None

接收與驗證請求資料:使用 Pydantic 模型

from pydantic import BaseModel

class Item(BaseModel):
name: str
description: str = None
price: float
in_stock: bool = True

@app.post("/items/")
def create_item(item: Item):
return {"message": "Item created", "item": item}

發送 POST 請求:

POST /items/
{
"name": "Laptop",
"description": "A powerful device",
"price": 1299.99,
"in_stock": true
}

回應:

{
"message": "Item created",
"item": {
"name": "Laptop",
"description": "A powerful device",
"price": 1299.99,
"in_stock": true
}
}
  • Pydantic 會自動進行資料驗證與轉換
  • FastAPI 可根據模型自動生成 API 文件

表單與檔案上傳支援

from fastapi import Form, UploadFile, File

@app.post("/submit/")
def submit_form(username: str = Form(...), file: UploadFile = File(...)):
return {
"username": username,
"filename": file.filename,
"content_type": file.content_type
}

這對於處理使用者上傳檔案與表單資料非常方便。


回傳自定義 HTTP 狀態碼與錯誤處理

from fastapi import HTTPException

@app.get("/users/{user_id}")
def read_user(user_id: int):
if user_id != 1:
raise HTTPException(status_code=404, detail="User not found")
return {"user_id": user_id, "name": "Alice"}

這會回傳:

{
"detail": "User not found"
}

並帶有 HTTP 404 錯誤。


小結與下一步學習方向

FastAPI 提供了一種現代化且優雅的方式來構建 API:

  • 強大的型別檢查與 IDE 支援
  • 直覺的程式結構與文件生成
  • 高效能適合用於生產環境

建議學習方向:

  1. 路由分割與模組化管理
  2. 使用依賴注入(Depends)
  3. 整合資料庫(如 SQLAlchemy)
  4. JWT 身份驗證與 OAuth2
  5. 測試與部署(例如 Docker、Gunicorn)

如果你是從 Flask 或 Django REST Framework 轉過來,會發現 FastAPI 提供了相當先進的開發體驗與高效能,是非常值得學習與投入的框架。

參考文件

  1. fastapi API