Skip to content

Python Web 框架

開發網站或 Web API 時,從零開始處理底層的網絡請求、路由、HTTP 協議等細節,不僅耗時而且容易出錯。Web 框架 (Web Framework) 的出現正是為了解決這個問題。它提供了一套標準化的工具和結構,讓你能夠專注於應用程式的業務邏輯,從而大幅提升開發效率和代碼質量。

Python 擁有一個非常活躍和成熟的生態系統,其中包含了各式各樣的 Web 框架,可以滿足不同的開發需求。從適合新手的輕量級框架到功能強大的全功能框架,應有盡有。

在深入了解各個框架之前,首先需要理解支撐這些框架運行的兩個核心概念:WSGI 和 ASGI。它們是 Web 伺服器與 Python 應用程式之間的溝通橋樑,理解它們的差異,有助於你根據項目需求選擇最合適的技術棧。

🤔 WSGI vs. ASGI:同步框架 與 非同步框架

WSGI (Web Server Gateway Interface) 和 ASGI (Asynchronous Server Gateway Interface) 是一種標準化的介面規範,它定義了 Web 伺服器 (例如 Nginx、Gunicorn) 如何將請求轉發給 Python Web 應用程式處理,並接收應用程式返回的響應。

  • WSGI 是 Python Web 開發的傳統標準,採用同步 (Synchronous) 模式。簡單來說,對於每一個進來的請求,伺服器的工作線程 (worker) 會完整處理完這個請求後,才能處理下一個。這種模式簡單直接,非常適合傳統的、以 CPU 運算為主的網站應用。

  • ASGI 則是為了應對現代網絡應用需求而生的新一代標準,它支援非同步 (Asynchronous) 處理。在非同步模式下,當一個請求遇到 I/O 等待(例如讀寫資料庫、請求外部 API)時,伺服器可以先去處理其他請求,而無需原地等待。這使得單一工作線程能同時應對大量連接,特別適合需要高併發、實時通訊(如 WebSocket 聊天室)或大量 I/O 操作的應用。

以下是兩者的簡單比較:

特性WSGIASGI
處理模式同步 (Synchronous)非同步 (Asynchronous)
併發模型一個請求由一個線程/進程從頭到尾處理事件驅動,單一進程可處理多個 I/O 密集型請求
適用場景傳統網站、標準 CRUD API、CPU 密集型應用高併發 API、WebSocket、實時應用、I/O 密集型應用
協議支援HTTPHTTP, WebSocket, 以及其他長連接協議
代表框架Flask, DjangoFastAPI, Starlette, Quart

何時選擇?

  • 如果你正在開發一個標準的企業網站、內容管理系統 (CMS) 或內部工具,且不需要處理大量同時發生的長連接,WSGI 框架(如 Flask、Django)成熟穩定,生態豐富,是絕佳的選擇。
  • 如果你要開發一個需要極高性能的 API、實時聊天應用、數據流處理服務,或任何涉及大量網絡 I/O 的場景,ASGI 框架(如 FastAPI)能提供顯著的性能優勢。

🏛️ 傳統而強大:WSGI 框架 (Flask & Django)

WSGI 框架經過多年的發展,擁有龐大的社群、豐富的文件和海量的第三方套件,穩定性極高。其中,Flask 和 Django 是最具代表性的兩個框架。

Flask:輕量級的微框架

Flask 被稱為「微框架 (micro-framework)」,其核心極簡,只提供路由和請求處理等基本功能。其他如資料庫操作、用戶認證、表單驗證等功能,都需要透過安裝擴充套件 (extensions) 來實現。

你可像砌積木一樣,只選擇你需要的組件,打造一個完全客製化的應用。

優點:

  • 簡單易學:API 設計直觀,上手門檻低,非常適合初學者。
  • 靈活性高:沒有太多的規則束縛,你可以自由選擇工具和設計模式。
  • 擴充性強:擁有豐富的第三方擴充套件,如 Flask-SQLAlchemy (資料庫)、Flask-Login (用戶認證) 等。

缺點:

  • 功能需自行整合:預設不包含資料庫 ORM (Object-Relational Mapping)、Admin 管理後台等進階功能,需要花時間選擇和配置。

代碼範例

以下是一個簡單的 Flask 應用,展示了如何定義路由和處理請求。

python
# 1. 安裝 Flask: pip install Flask
from flask import Flask, request, jsonify

# 2. 創建 Flask app object
app = Flask(__name__)

# 3. 定義根目錄路由,返回簡單字串
@app.route('/')
def hello_world():
    return 'Hello, World!'

# 4. 定義帶有 path parameter 的路由
@app.route('/user/<username>')
def show_user_profile(username):
    return f'User: {username}'

# 5. 處理 GET 請求的 query parameter
@app.route('/search')
def search():
    query = request.args.get('q', 'default_query') # 從 URL?q=... 獲取參數
    return jsonify({'query': query})

if __name__ == '__main__':
    # 運行開發伺服器
    app.run(debug=True)

對於初學者來說,從 Flask 開始是個不錯的選擇。它能讓你快速理解 Web 框架的核心概念,而不會被過多的複雜性所淹沒。

Django:功能齊全的「全包宴」框架

與 Flask 相反,Django 是一個「全包宴 (batteries-included)」框架。它內建了開發大型 Web 應用所需的一切,包括強大的 ORM、自動化的 Admin 管理後台、用戶認證系統、表單處理、安全防護等。

Django 遵循「不要重複造輪子 (Don't Repeat Yourself, DRY)」的原則,提供了一套高度整合和規範化的開發模式。

優點:

  • 功能完備:開箱即用,內建 ORM 和 Admin 後台,能極大地縮短後端開發時間。
  • 高度整合:各組件之間協同工作良好,減少了整合的麻煩。
  • 安全可靠:內建多種安全機制,如 CSRF 保護、SQL Injection 防護等。
  • 社群龐大:擁有海量文件和成熟的解決方案。

缺點:

  • 學習曲線較陡:概念和組件較多,需要花更多時間學習。
  • 較為笨重:對於小型項目,可能會顯得過於龐大和複雜。
  • 靈活性較低:框架有自己的「做事方式」,客製化自由度不如 Flask。

代碼範例

Django 的開發更具結構性。以下是定義一個簡單模型的例子,並展示如何將其註冊到 Admin 後台。

  1. 定義模型 (models.py): Django 的 ORM 讓你用 Python class 來定義資料庫表格。

    python
    from django.db import models
    
    class Article(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        pub_date = models.DateTimeField('date published')
    
        def __str__(self):
            return self.title
  2. 註冊到 Admin 後台 (admin.py): 只需幾行代碼,Django 就能為你的模型生成一個功能齊全的增刪改查 (CRUD) 管理介面。

    python
    from django.contrib import admin
    from .models import Article
    
    admin.site.register(Article)

完成以上步驟並執行資料庫遷移後,你就能登入 Django 的 Admin 後台,直接對 Article 進行管理,無需編寫任何前端代碼。這對於需要快速開發後台管理系統的項目來說,是一個巨大的優勢。

🚀 現代與高效:ASGI 框架 (FastAPI)

隨著對 Web 應用性能和併發能力要求的提高,ASGI 框架應運而生。它們天生為非同步而設計,能更有效地利用伺服器資源。

FastAPI:為速度而生的 API 框架

FastAPI 是近年來最受歡迎的 Python 框架之一。它基於 Starlette (一個輕量級的 ASGI 工具包) 和 Pydantic (一個強大的數據驗證庫) 構建。

FastAPI 的核心優勢在於其極致的性能和現代化的開發體驗。

優點:

  • 極高性能:得益於非同步特性和 Starlette,其性能與 NodeJS 和 Go 相當。
  • 基於類型提示:利用 Python 的類型提示 (Type Hints) 和 Pydantic 進行自動數據驗證、序列化和文檔生成。
  • 自動生成 API 文檔:能自動生成交互式的 API 文檔 (Swagger UI 和 ReDoc),極大地方便了 API 的調試和協作。
  • 開發速度快:直觀的 API 設計和自動化功能減少了約 40% 的開發時間。

缺點:

  • 生態系統較新:雖然發展迅速,但相比 Django 和 Flask,其社群和第三方套件的積累尚淺。
  • 主要專注於 API:雖然也能渲染 HTML 模板,但其設計初衷是構建 API 服務,而非傳統的、重前端渲染的網站。

代碼範例

FastAPI 的代碼非常簡潔和現代化。

python
# 1. 安裝: pip install fastapi "uvicorn[standard]" pydantic

# fastapi_test.py

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

# 2. 創建 FastAPI app object
app = FastAPI()

# Pydantic 模型,用於請求 body 的驗證
class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None

# 3. 定義一個非同步的 GET endpoint
@app.get("/")
async def read_root():
    return {"Hello": "World"}

# 4. 定義帶有 path parameter 和類型提示的 endpoint
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

# 5. 定義一個 POST endpoint,使用 Pydantic 模型驗證請求 body
@app.post("/items/")
async def create_item(item: Item):
    return item

然後執行:

uvicorn fastapi_test:app --host 0.0.0.0 --port 8000

當你運行這個應用後,訪問 http://127.0.0.1:8000/docs,你將看到一個由 FastAPI 自動生成的交互式 API 文檔頁面,你可以在上面直接測試你的 API。

📝 總結:如何選擇合適的框架?

選擇哪個框架並沒有絕對的答案,完全取決於你的項目需求、團隊經驗和個人偏好。以下是一個簡單的決策指南:

  • 如果你是初學者,或想快速開發一個小型項目、原型或簡單的 API: 👉 Flask 是你的最佳起點。它簡單、靈活,能讓你專注於核心邏輯。

  • 如果你要開發一個功能複雜、數據驅動的大型網站,需要用戶認證和後台管理系統: 👉 Django 是不二之選。它提供的「全包宴」功能能讓你事半功倍,快速構建出穩定可靠的系統。

  • 如果你要開發一個對性能和併發有極高要求的現代 API,或者需要用到 WebSocket 等實時技術: 👉 FastAPI 將是你的利器。它的非同步特性、類型檢查和自動文檔生成能顯著提升開發效率和應用性能。

無論你選擇哪個框架,最重要的是動手實踐。從一個小項目開始,親自體驗不同框架的設計哲學和開發流程,你將會更快地找到最適合你的那一個。祝你在 Python Web 開發的道路上一帆風順!

📚 參考資料

KF Software House