Django 中自定義 404 專案架構的最佳實踐
更新日期: 2025 年 1 月 1 日
本文為 Django + Vue 前後端分離解析,第 1 篇:
- 前後端分離的 404 錯誤處理:步驟指南
- 正常網頁與 API 接口:新手指南
- GraphQL 與 REST:理解新時代的 API 設計
- 為什麼自定義 404 頁面需要同時支持 API 和 HTML:新手指南
- 前後端分離中的路由與錯誤處理:新手指南
- 設計後端 API 的 404 錯誤處理:新手指南
- 前端與後端的 HTTP 請求與響應協議
- Django 中自定義 404 專案架構的最佳實踐 👈 所在位置
- 深入理解 Django 中的自定義 404 views 函數處理解析
- Django 的 handler404:自定義 404 錯誤頁面的核心
- Django 的 render 函數與 status 參數:為什麼重要?
- 使用 Accept 判斷請求格式:如何實現靈活的錯誤處理?
- 使用 Esbuild 搭建 Vue 開發環境的指南
- 新手入門:TailwindCSS 與 DaisyUI 的整合指南
- Django 靜態文件管理:static 與 staticfiles 完整指南
- 使用 WhiteNoise 簡化 Django 靜態文件管理:新手入門指南
- Vue 與 Django 整合:從編輯到部署的完整指南
- Django 與 Vue 的專案目錄與設計流程指南
- Django + Vue 前後端分離架構:後端路由渲染解析
- Vue 3 應用的主入口詳解:如何初始化應用
- 探索 Vue 應用的根組件:App.vue 的角色與設計
- Vue.js 單頁應用(SPA)邏輯與運作流程詳解
- 新手指南:使用 Axios 實現高效的 HTTP 請求
- 在 Vue 中處理 404 錯誤組件(component)設計:新手指南
- Vue Router 新手指南:設置 404 錯誤頁面
自定義 404 處理是提升用戶體驗的重要部分。
在 Django 中,我們可以通過定義自適應的 404 處理邏輯,根據請求類型(如 API 請求或瀏覽器訪問)返回不同格式的錯誤信息。
那麼,custom_404_view
應該放在哪裡呢?
這取決於你的項目結構和需求,以下是不同選擇的分析及建議。
放在核心功能的 core
App 中
適用場景
- 小型或中型項目:
- 項目結構簡單,功能未細分。
- 統一管理全局功能:
- 如果已有一個專門負責全局功能(如錯誤處理、設置管理)的 App(通常命名為
core
或common
),可以將custom_404_view
放在這裡。
- 如果已有一個專門負責全局功能(如錯誤處理、設置管理)的 App(通常命名為
優點
- 集中管理:所有全局功能都在同一個地方,便於維護。
- 簡化邏輯:對於小型項目,避免引入過多的 App 增加複雜度。
操作步驟
- 在
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)
- 在主路由文件
urls.py
中引用:
from core.views import custom_404_view
handler404 = custom_404_view
- 在
core/templates/404.html
中設計錯誤頁面。
2. 創建專門的 errors
App
適用場景
- 大型項目:
- 項目分工明確,每個 App 各自負責特定業務。
- 多錯誤頁需求:
- 如果需要處理多種錯誤(如 403、500)並單獨維護,將所有錯誤處理相關邏輯放在一個專門的
errors
App 更加高效。
- 如果需要處理多種錯誤(如 403、500)並單獨維護,將所有錯誤處理相關邏輯放在一個專門的
優點
- 高可維護性:專門的 App 負責錯誤處理,結構清晰,適合大型項目。
- 擴展性強:方便未來添加其他錯誤處理邏輯。
操作步驟
- 創建
errors
App:
python manage.py startapp errors
python manage.py startapp errors
- 在
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)
- 在主路由文件
urls.py
中配置:
from errors.views import custom_404_view
handler404 = custom_404_view
- 在
errors/templates/404.html
中設計錯誤頁面。
放在業務相關的 App 中
適用場景
- 錯誤處理與某業務強相關:
- 如果 404 錯誤處理僅影響某個特定業務模塊(如文章系統或用戶系統),則將其放在對應的 App 中。
- 項目結構簡單,需求特化:
- 當業務場景較簡單,並且錯誤處理與全局功能無關時。
優點
- 緊密相關:錯誤處理直接集成到業務模塊,邏輯清晰。
- 方便維護:修改某業務的錯誤處理時,不需要跳轉到其他 App。
操作步驟
- 在業務相關的 App(如
articles
)的views.py
中添加custom_404_view
。 - 在主路由文件
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.py
的 TEMPLATES
中確保啟用 APP_DIRS
:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True, # 確保會自動查找每個 App 的 templates 資料夾
'OPTIONS': {...},
},
]
如何選擇?
- 小型項目或結構簡單:
- 放在 core App 中集中管理,便於統一維護。
- 大型項目或多錯誤需求:
- 創建專門的
errors
App,結構更清晰,方便擴展。
- 創建專門的
- 業務相關需求:
- 錯誤處理與某個業務緊密相關時,放在該業務的 App 中。
總結
無論選擇哪種方式,關鍵是保持項目結構清晰並滿足具體需求:
- 核心功能集中管理:適合簡單項目。
- 專門 App 分離邏輯:適合大型項目或多錯誤需求。
- 業務關聯性優先:適合錯誤處理與業務緊密結合的場景。
希望這篇指南能幫助你正確選擇並設置 custom_404_view
!如果有其他問題,歡迎隨時提問! 😊