跳轉到

開始之前

在開始學習 Django 之前,讓我們先了解一些基本概念。這些知識能幫助你更好地理解 Django 的設計理念和使用方式。

網站的架構

傳統架構(Server-Side Rendering)

在傳統的網站架構中,伺服器負責產生完整的 HTML 頁面,然後傳送給瀏覽器顯示。

sequenceDiagram
    participant Browser as 瀏覽器
    participant Server as 伺服器
    participant DB as 資料庫

    Browser->>Server: 請求網頁
    Server->>DB: 查詢資料
    DB-->>Server: 回傳資料
    Server->>Server: 組合 HTML
    Server-->>Browser: 回傳完整的 HTML 頁面
    Browser->>Browser: 顯示頁面

特點:

  • 每次換頁都需要重新載入整個頁面
  • 頁面內容由伺服器端產生
  • SEO(搜尋引擎最佳化)較容易
  • 適合內容為主的網站(部落格、新聞網站等)

優勢:

  • 開發相對簡單,前後端整合在一起
  • 首次載入速度快(伺服器已經準備好 HTML)
  • 對 SEO 友善

劣勢:

  • 每次操作都需要重新載入頁面
  • 伺服器負擔較重
  • 使用者體驗可能不如 SPA(Single Page Application)

前後端分離(Client-Side Rendering)

前後端分離的架構中,前端和後端是獨立的兩個系統。後端只提供 API(資料),前端負責渲染畫面。

sequenceDiagram
    participant Browser as 瀏覽器
    participant Frontend as 前端 APP
    participant Backend as 後端 API
    participant DB as 資料庫

    Browser->>Frontend: 請求網頁
    Frontend-->>Browser: 回傳 JavaScript App
    Browser->>Browser: 執行 JavaScript
    Browser->>Backend: 請求資料 (API)
    Backend->>DB: 查詢資料
    DB-->>Backend: 回傳資料
    Backend-->>Browser: 回傳 JSON 資料
    Browser->>Browser: 渲染頁面

特點:

  • 前端使用框架(如 React、Vue、Angular)
  • 後端只提供 API(通常是 RESTful API 或 GraphQL)
  • 頁面切換不需要重新載入
  • 適合互動性強的應用(社群網站、後台系統等)

優勢:

  • 使用者體驗佳(頁面切換快速流暢)
  • 前後端可以獨立開發和部署
  • 後端可以服務多個平台(Web、App、桌面程式)
  • 伺服器負擔較輕(只傳送資料)

劣勢:

  • 開發複雜度較高(需要學習前端框架)
  • 首次載入可能較慢(需要下載 JavaScript)
  • SEO 較困難(需要額外處理)
  • 需要處理 CORS 等跨域問題

Django 可以做什麼?

Django 兩種架構都支援!

  • 傳統架構:使用 Django 的模板系統(Template)產生 HTML
  • 前後端分離:使用 Django REST Framework 或 Django Ninja 提供 API

什麼是框架?

想像一下,如果你要蓋一棟房子,你有兩種選擇:

  1. 從零開始:自己燒磚、製作鋼筋、設計結構⋯⋯
  2. 使用建築框架:已經有基本的結構,你只需要裝潢和客製化

Web 框架就像是建築框架,它提供了網站開發的基礎結構和常用功能,讓你可以專注在業務邏輯上,而不用從頭實作所有功能。

框架提供了什麼?

以 Django 為例,框架通常會提供:

  • 路由系統 - 決定哪個網址對應哪段程式碼
  • 資料庫操作 - ORM(Object-Relational Mapping),用物件操作資料庫
  • 模板引擎 - 動態產生 HTML
  • 表單處理 - 處理使用者輸入和驗證
  • 身份驗證 - 使用者登入、權限管理
  • 安全防護 - CSRF、XSS、SQL Injection 等防護
  • 管理介面 - 自動產生的後台管理系統

為什麼要使用框架?

框架的優勢

  1. 節省時間 - 不用重複造輪子,專注在業務邏輯
  2. 最佳實踐 - 框架遵循業界的最佳實踐
  3. 安全性 - 框架處理了大部分的安全問題
  4. 可維護性 - 統一的結構讓程式碼更容易維護
  5. 社群支援 - 大量的教學資源和套件

Python 的框架有哪些?

Python 有許多 Web 框架,以下是幾個主流的選擇:

框架的比較

框架 類型 特點 適合場景
Django Full-Stack 功能完整、內建很多功能 中大型專案、快速開發
Flask Micro 輕量、彈性高 小型專案、API、學習用
FastAPI Modern 現代、高效能、自動文件 API 開發、微服務

各框架簡介

Django

  • 定位:「電池已備齊」的全功能框架
  • 哲學:提供一切你需要的功能
  • 學習曲線:中等(功能多但架構清晰)

Flask

  • 定位:微框架,核心簡單
  • 哲學:只提供核心功能,其他靠擴充套件
  • 學習曲線:低(適合初學者入門)

FastAPI

  • 定位:現代化 API 框架
  • 哲學:快速、型別安全、自動文件
  • 學習曲線:中等(需要理解型別提示)

我該選擇哪個框架?

這取決於你的需求:

  • 快速開發完整網站 → Django
  • 學習 Web 基礎 / 小專案 → Flask
  • 開發 API → FastAPI 或 Django REST Framework

我們這邊選擇 Django,因為它功能完整、適合學習,而且能處理各種規模的專案。在初學的時候選擇這種較為完整的框架可以省去自己整合各種元件的成本,先看大型框架如何實作知道要注意的地方,後面若換到輕量框架時也會比較輕鬆一些。

Django 介紹

Django 是一個用 Python 撰寫的開源 Web 框架,於 2005 年發布,目前由 Django Software Foundation 維護。

口號:「The web framework for perfectionists with deadlines」(給追求完美但有時間壓力的人的 Web 框架)

MTV 架構

Django 採用 MTV 架構(Model-Template-View),這是對經典 MVC 架構的變體。

flowchart TB
    A[使用者請求] --> B[Middleware]
    B --> C[URL]
    C --> D[View]
    D --> E{需要資料?}
    E -->|是| F[Model]
    F --> G[資料庫]
    G --> F
    F --> D
    E -->|否| D
    D --> H[Template]
    H --> I[Middleware]
    I --> J[網頁內容]

Model

  • 定義資料結構
  • 處理資料庫操作
  • 相當於 MVC 的 Model
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

Template

  • 負責呈現資料
  • 使用模板語言動態產生 HTML
  • 相當於 MVC 的 View
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>

View

  • 處理商業邏輯
  • 接收請求、處理資料、回傳回應
  • 相當於 MVC 的 Controller
def article_detail(request, id):
    article = Article.objects.get(id=id)
    return render(request, 'article.html', {'article': article})

MTV vs MVC

Django 的 MTV 其實就是 MVC,只是命名不同:

  • Model = Model(資料層)
  • Template = View(呈現層)
  • View = Controller(控制層)

Django 選擇這樣命名是為了避免混淆,因為在 Django 中,框架本身就是 Controller 而 View 只是處理邏輯的地方。

Middleware 是什麼?
  • 在請求進入 View 之前和回應離開之後執行
  • 用於處理跨 View 的共用功能(如身份驗證、日誌記錄、CORS)
  • 可以修改請求或回應
class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 請求進入 View 之前執行
        print(f"Request: {request.path}")

        response = self.get_response(request)

        # 回應離開之後執行
        print(f"Response: {response.status_code}")
        return response

Django 的優勢是什麼?

主要優勢

1. 功能完整,開箱即用

  • 內建 ORM、身份驗證、管理介面、表單處理等
  • 不需要煩惱要選擇哪些套件

2. 自動產生的管理後台

  • 5 分鐘就能建立功能完整的後台系統
  • 可以快速進行資料管理和測試

3. 優秀的 ORM

  • 不需要寫 SQL,用 Python 物件操作資料庫
  • 支援多種資料庫(PostgreSQL、MySQL、SQLite、Oracle)

4. 安全性設計

  • 內建防護:CSRF、XSS、SQL Injection、Clickjacking
  • 定期更新安全性補丁

5. 可擴展性

  • 適合各種規模的專案(從小部落格到大型網站)
  • Instagram、Pinterest、Mozilla 都使用 Django

6. 優秀的文件

  • 官方文件詳細且清楚
  • 大量的第三方教學資源

7. 豐富的生態系統

  • Django REST Framework(API 開發)
  • Django Channels(WebSocket)
  • 數千個可重用的 Django 應用程式

8. 強大的社群

  • 活躍的社群支援
  • 大量的開源專案可以參考

Django 又有哪些劣勢?

需要注意的地方

1. 學習曲線較陡

  • 剛接觸時功能多,需要時間學習,理解底層原理
  • 但一旦學會,開發效率很高

2. 框架較重

  • 相比 FastAPI / Flask 等微框架,Django 包含了很多你可能不需要的功能,若你不需要你要自行將它拔除
  • 但對大多數專案來說,這些功能很有用

3. 對小型 API 來說可能過重

  • 如果只是要開發簡單的 API,FastAPI 可能更適合
  • 但 Django REST Framework 功能非常強大

4. 非同步支援較晚加入

  • Django 3.0 才開始支援 ASGI(非同步)
  • 但現在已經支援還不是 100% 完整