Django 的 handler404:自定義 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 錯誤頁面

在 Django 應用中,handler404 是一個特殊的路由變數,用於處理所有未匹配路徑的請求。

通過自定義 handler404,我們可以返回結構化的 JSON 數據或渲染友好的 HTML 錯誤頁,適配 API 和普通瀏覽器請求。

本文將介紹 handler404 的核心概念、配置方式以及測試方法,幫助你全面掌握 Django 的 404 錯誤處理。


什麼是 handler404

  • 定義
    handler404 是 Django 中專門用來處理 HTTP 404 錯誤的路由變數。

    當用戶請求的 URL 無法在 urlpatterns 中找到匹配時,Django 會自動調用 handler404 指定的函數。
  • 作用
    • 自定義錯誤頁的內容。
    • 支援不同的響應類型(例如 JSON 或 HTML)。
    • 提升用戶體驗和開發靈活性。

如何配置 handler404

編寫自定義 404 處理函數

handler404 函數的簽名必須包含兩個參數:requestexception

以下是一個同時支援 JSON 和 HTML 返回的自定義函數:

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 on this server."  
        }, status=404)  
    else:  
        return render(request, "404.html", status=404)  

在主路由中設置 handler404

在 Django 的主路由文件 urls.py 中,將 handler404 指向自定義函數。

from core.views import custom_404_view  

# 配置自定義的 404 錯誤處理  
handler404 = custom_404_view  

注意

  • handler404 不需要顯式添加到 urlpatterns 中,Django 會在找不到匹配路由時自動執行該函數。
  • 此配置適用於所有應用的未匹配路徑。

handler404 的工作原理

  1. 路由匹配機制
    • 當用戶發送一個請求時,Django 會依次檢查 urlpatterns 中的路徑是否與請求的 URL 匹配。
    • 如果找到匹配的路徑,執行對應的視圖函數;如果無匹配,觸發 404 錯誤。
  2. 調用 handler404
    • Django 會將請求傳遞給 handler404 中配置的函數。
    • 該函數根據請求頭(Accept)判斷是否返回 JSON 或渲染 HTML 模板。

測試自定義 404 的方法

API 測試:使用 Postman 或 cURL

測試 JSON 響應

發送 GET 請求到一個不存在的 API 路徑,並設置 Accept: application/json 標頭。

  • 使用 Postman
    • 在 Headers 中添加 Accept: application/json
    • 發送請求到 /api/nonexistent/
  • 使用 cURL
curl -H "Accept: application/json" http://127.0.0.1:8000/api/nonexistent/  
  • 預期結果
    返回以下 JSON 響應:
{  
    "error": "Page not found",  
    "status_code": 404,  
    "detail": "The requested URL was not found on this server."  
}  

瀏覽器測試:檢查 HTML 響應

直接在瀏覽器中輸入一個不存在的 URL,例如 http://127.0.0.1:8000/nonexistent/,檢查是否正確加載 404.html 錯誤頁面。


最佳實踐與注意事項

確保 DEBUG=False

handler404 僅在 DEBUG=False 時啟用。

在開發環境中,DEBUG=True 時 Django 預設顯示調試頁面。

settings.py 中設置:

DEBUG = False  
ALLOWED_HOSTS = ['*']  

提供統一的錯誤頁模板

404.html 模板放在主應用(例如 core)的 templates 資料夾中,確保模板結構清晰且內容友好。

測試覆蓋多種請求情境

  • 測試 API 請求與瀏覽器請求的返回內容是否符合預期。
  • 確保所有未匹配路徑都能正確觸發自定義邏輯。

結語

通過配置 handler404,我們可以靈活地處理 404 錯誤頁,無論是前後端分離的 API 請求,還是普通的瀏覽器訪問,都能提供更好的用戶體驗。

這種設計適用於小型到大型項目,幫助開發者有效地管理未匹配路徑,提升應用的健壯性與用戶友好性。

現在就試著為你的項目添加自定義的 handler404 吧!如果遇到問題,歡迎隨時討論 😊

Similar Posts

發佈留言

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