Django 中自定義 404 專案架構的最佳實踐

更新日期: 2025 年 1 月 1 日

本文為 Django + Vue 前後端分離解析,第 1 篇

  1. 前後端分離的 404 錯誤處理:步驟指南
  2. 正常網頁與 API 接口:新手指南
  3. GraphQL 與 REST:理解新時代的 API 設計
  4. 為什麼自定義 404 頁面需要同時支持 API 和 HTML:新手指南
  5. 前後端分離中的路由與錯誤處理:新手指南
  6. 設計後端 API 的 404 錯誤處理:新手指南
  7. 前端與後端的 HTTP 請求與響應協議
  8. Django 中自定義 404 專案架構的最佳實踐 👈 所在位置
  9. 深入理解 Django 中的自定義 404 views 函數處理解析
  10. Django 的 handler404:自定義 404 錯誤頁面的核心
  11. Django 的 render 函數與 status 參數:為什麼重要?
  12. 使用 Accept 判斷請求格式:如何實現靈活的錯誤處理?
  13. 使用 Esbuild 搭建 Vue 開發環境的指南
  14. 新手入門:TailwindCSS 與 DaisyUI 的整合指南
  15. Django 靜態文件管理:static 與 staticfiles 完整指南
  16. 使用 WhiteNoise 簡化 Django 靜態文件管理:新手入門指南
  17. Vue 與 Django 整合:從編輯到部署的完整指南
  18. Django 與 Vue 的專案目錄與設計流程指南
  19. Django + Vue 前後端分離架構:後端路由渲染解析
  20. Vue 3 應用的主入口詳解:如何初始化應用
  21. 探索 Vue 應用的根組件:App.vue 的角色與設計
  22. Vue.js 單頁應用(SPA)邏輯與運作流程詳解
  23. 新手指南:使用 Axios 實現高效的 HTTP 請求
  24. 在 Vue 中處理 404 錯誤組件(component)設計:新手指南
  25. Vue Router 新手指南:設置 404 錯誤頁面

自定義 404 處理是提升用戶體驗的重要部分。

在 Django 中,我們可以通過定義自適應的 404 處理邏輯,根據請求類型(如 API 請求或瀏覽器訪問)返回不同格式的錯誤信息。

那麼,custom_404_view 應該放在哪裡呢?

這取決於你的項目結構和需求,以下是不同選擇的分析及建議。


放在核心功能的 core App 中

適用場景

  1. 小型或中型項目
    • 項目結構簡單,功能未細分。
  2. 統一管理全局功能
    • 如果已有一個專門負責全局功能(如錯誤處理、設置管理)的 App(通常命名為 corecommon),可以將 custom_404_view 放在這裡。

優點

  • 集中管理:所有全局功能都在同一個地方,便於維護。
  • 簡化邏輯:對於小型項目,避免引入過多的 App 增加複雜度。

操作步驟

  1. core/views.py 中添加 custom_404_view
from django.shortcuts import render
from django.http import JsonResponse

def custom_404_view(request, exception):
    if "application/json" in request.headers.get("Accept", ""):
        return JsonResponse({
            "error": "Page not found",
            "status_code": 404,
            "detail": "The requested URL was not found."
        }, status=404)
    else:
        return render(request, "404.html", status=404)
  1. 在主路由文件 urls.py 中引用:
from core.views import custom_404_view

handler404 = custom_404_view
  1. core/templates/404.html 中設計錯誤頁面。

2. 創建專門的 errors App

適用場景

  1. 大型項目
    • 項目分工明確,每個 App 各自負責特定業務。
  2. 多錯誤頁需求
    • 如果需要處理多種錯誤(如 403、500)並單獨維護,將所有錯誤處理相關邏輯放在一個專門的 errors App 更加高效。

優點

  • 高可維護性:專門的 App 負責錯誤處理,結構清晰,適合大型項目。
  • 擴展性強:方便未來添加其他錯誤處理邏輯。

操作步驟

  1. 創建 errors App:
python manage.py startapp errors
  1. python manage.py startapp errors
  2. errors/views.py 中添加 custom_404_view
from django.http import JsonResponse
from django.shortcuts import render

def custom_404_view(request, exception):
    if "application/json" in request.headers.get("Accept", ""):
        return JsonResponse({
            "error": "Page not found",
            "status_code": 404,
            "detail": "The requested URL was not found."
        }, status=404)
    else:
        return render(request, "404.html", status=404)
  1. 在主路由文件 urls.py 中配置:
from errors.views import custom_404_view

handler404 = custom_404_view
  1. errors/templates/404.html 中設計錯誤頁面。

放在業務相關的 App 中

適用場景

  1. 錯誤處理與某業務強相關
    • 如果 404 錯誤處理僅影響某個特定業務模塊(如文章系統或用戶系統),則將其放在對應的 App 中。
  2. 項目結構簡單,需求特化
    • 當業務場景較簡單,並且錯誤處理與全局功能無關時。

優點

  • 緊密相關:錯誤處理直接集成到業務模塊,邏輯清晰。
  • 方便維護:修改某業務的錯誤處理時,不需要跳轉到其他 App。

操作步驟

  1. 在業務相關的 App(如 articles)的 views.py 中添加 custom_404_view
  2. 在主路由文件 urls.py 中引用該函數。

如何處理 404 的模板文件?

模板文件的放置

對應的 404.html 通常放在與 custom_404_view 關聯的 App 的模板目錄中。

文件結構範例

以放置在 core App 中為例:

project/
├── core/
   ├── templates/
      └── 404.html  # 自定義錯誤頁面
   ├── views.py      # 包含 custom_404_view
├── project/
   ├── urls.py       # 配置 handler404
└── ...

設計模板文件

core/templates/404.html 中設計錯誤頁:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>404 - Page Not Found</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; margin: 50px; }
        h1 { font-size: 48px; color: #333; }
        p { font-size: 18px; color: #666; }
    </style>
</head>
<body>
    <h1>404 - Page Not Found</h1>
    <p>Sorry, the page you are looking for does not exist.</p>
    <a href="/">Return to Home</a>
</body>
</html>

模板文件的加載邏輯

settings.pyTEMPLATES 中確保啟用 APP_DIRS

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,  # 確保會自動查找每個 App 的 templates 資料夾
        'OPTIONS': {...},
    },
]

如何選擇?

  1. 小型項目或結構簡單
    • 放在 core App 中集中管理,便於統一維護。
  2. 大型項目或多錯誤需求
    • 創建專門的 errors App,結構更清晰,方便擴展。
  3. 業務相關需求
    • 錯誤處理與某個業務緊密相關時,放在該業務的 App 中。

總結

無論選擇哪種方式,關鍵是保持項目結構清晰並滿足具體需求:

  • 核心功能集中管理:適合簡單項目。
  • 專門 App 分離邏輯:適合大型項目或多錯誤需求。
  • 業務關聯性優先:適合錯誤處理與業務緊密結合的場景。

希望這篇指南能幫助你正確選擇並設置 custom_404_view!如果有其他問題,歡迎隨時提問! 😊

Similar Posts

發佈留言

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