重點摘要: - Django App 不僅僅是資料夾的劃分 - 它不是一個部署單位,而是業務領域的劃分單位 - 在 DRF 中,它像功能模組一樣運作,優勢顯而易見 - 對於一般的 Django 網頁應用程式,初期可能感覺不到其必要性 - 但隨著專案規模擴大,在模型、Admin、測試和資料遷移的管理上差異會越來越大 - 精心設計的 App 最終能成為可移植到其他專案的可重複使用資產

即使 Django 專案最終會部署在同一台伺服器上,我們仍然可以透過 startapp 指令劃分出多個 App。 儘管這種結構在基於 DRF 的無頭 API 伺服器中尤其自然,但在基於範本的 Django 網頁應用程式中,App 劃分仍然具有重要意義。

Django 專案結構概念圖

DRF 中 App 劃分如此適合的原因

  • API 邊界清晰

  • accounts

  • posts
  • billing
  • notifications

  • 每個 App 都像獨立的 API 模組一樣運作

  • models

  • serializers
  • views / viewsets
  • permissions
  • urls
  • tests

  • 在單一 DRF 伺服器中,能以標準化方式擴展多種功能

  • 即使不同 App 在同一專案中,也能產生意想不到的協同效應

  • 文章發布 → 產生通知

  • 支付狀態 → 變更使用者權限
  • 使用者設定 → 變更內容顯示方式

一般 Django 網頁應用程式的疑問

在基於範本的 Django 網頁應用程式中,即使劃分了 App,最終也都是:

  • 在同一台伺服器上執行
  • 使用相同的資料庫 (DB)
  • 共享相同的 settings 設定檔
  • 歸屬於相同的部署單位
  • 範本的流程也容易相互混淆

因此,對於小型網頁應用程式,可能會產生「真的有必要劃分 App 嗎?」的疑問。

儘管如此,劃分 App 的原因

  • 避免模型過於龐大
  • Admin 介面能依據領域進行組織
  • 資料遷移 (migrations) 歷史記錄會依 App 劃分
  • 更容易單獨測試特定 App
  • 有助於關注 import 結構,避免產生義大利麵條式程式碼 (Spaghetti Code)
  • 當未來需要拆分功能或轉化為 API 時,邊界已然存在

App 可以成為可重複使用的組件

Django 的 App 結構允許我們將功能打造成隨插即用 (Plug-and-Play) 的組件

即使是在專案內部建立的 App,只要結構設計得當,未來就能輕鬆地移植到其他專案中。

例如:

  • 通知功能 → notifications
  • 標籤功能 → tags
  • 支付功能 → billing

如果將這些 App 獨立開發,在下一個專案中就能以如下方式重複使用:

  • 複製 App 資料夾
  • 將其新增到 INSTALLED_APPS
  • 連接所需的 URL
  • 執行資料遷移 (migrations)
  • 僅需根據專案調整範本或設定

Django 生態系統中著名的函式庫也以這種方式提供:

  • django-allauth:以 App 形式提供會員註冊、登入和社群登入功能

  • django-taggit:以可重複使用的 App 形式提供標籤功能

  • django-tailwind:以 App 形式將 Tailwind 開發環境整合到 Django 專案中

換句話說,Django App 不僅僅是「我專案內部的資料夾」,如果設計得好,它能成為可在其他專案中重複使用的功能資產

良好的劃分標準

劃分 App 的訊號:

  • 擁有獨立的資料模型
  • 需要獨立的 Admin 群組
  • 具備自身的業務邏輯
  • 希望能獨立執行測試
  • 未來有可能被拆分為 API 或獨立服務
  • 功能名稱能以服務領域來描述
  • 有可能在其他專案中重複使用

範例:

  • accounts
  • billing
  • notifications
  • support
  • analytics

結論

Django 專案中,App 的劃分是:

當專案規模擴大時,將複雜性收斂到人類可理解的單位結構

更進一步來說,它也是:

將可重複使用的功能資產化的 Django 式模組系統

DRF 中,這項優勢與 API 邊界完美契合,因此顯而易見。 而在一般的 Django 網頁應用程式中,其價值則傾向於在專案規模擴大或開始建立多個專案時才會逐漸顯現。