為什麼自定義 404 頁面需要同時支持 API 和 HTML:新手指南

更新日期: 2025 年 1 月 1 日

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

  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 錯誤頁面

在現代開發中,一個後端服務器經常同時支持:

  1. API 請求:為前端應用或第三方工具提供數據。
  2. HTML 請求:為普通瀏覽器用戶提供直觀的頁面。

因此,當用戶訪問一個不存在的路徑時,我們的自定義 404 錯誤處理函數需要根據請求的來源返回不同類型的響應——JSON 格式的數據HTML 模板

本文將詳細講解這種設計的原因、應用場景以及如何實現。


API 與 HTML 共存的必要性

Django 是全功能框架

Django 不僅用於構建 API(例如通過 Django REST Framework),也常用於構建傳統的 Web 應用。這使得後端可能需要同時處理:

  • API 請求:返回數據供前端程式使用。
  • HTML 請求:為普通用戶渲染完整的頁面。

例如:

  • API 請求https://example.com/api/users
  • HTML 請求https://example.com/about

不同類型的請求需要不同的返回格式

  • API 請求
    • 返回 JSON 格式的錯誤信息,方便前端應用程式或工具(如 Postman)解析。
    • 例如:
{
  "error": "Page not found",
  "status_code": 404,
  "detail": "The requested URL was not found on this server."
}
  • HTML 請求
    • 返回一個友好的錯誤頁面,提升普通用戶體驗。
    • 例如:
<h1>404 - Page Not Found</h1>
<p>Oops! The page you're looking for doesn't exist.</p>

代碼重用的優勢

在 Django 中,我們可以通過一個統一的函數處理這兩種類型的請求。這樣做的好處是:

  • 減少代碼重複:不需要為 API 和 HTML 錯誤分別撰寫兩套邏輯。
  • 維護方便:修改錯誤處理邏輯時,只需更改一處代碼。

常見的使用場景

API 客戶端請求

  • 場景:前端框架(如 React、Vue)或測試工具(如 Postman)向後端發送 API 請求,但路徑不存在。
  • 需求:返回結構化的 JSON 錯誤信息,便於程式解析和處理。
  • 例子
    • 請求 URLGET https://example.com/api/nonexistent
    • 返回結果
{
  "error": "Page not found",
  "status_code": 404,
  "detail": "The requested URL was not found on this server."
}

瀏覽器直接訪問

  • 場景:用戶在瀏覽器中手動輸入錯誤的 URL(如 /some-wrong-url)。
  • 需求:返回一個美觀的 HTML 錯誤頁面,例如包含「404 – 頁面不存在」的提示。
  • 例子
    • 請求 URLhttps://example.com/some-wrong-url
    • 返回結果
<html>
<body>
  <h1>404 - Page Not Found</h1>
  <p>Oops! The page you're looking for doesn't exist.</p>
</body>
</html>
  • <html> <body> <h1>404 - Page Not Found</h1> <p>Oops! The page you're looking for doesn't exist.</p> </body> </html>

如何實現判斷請求類型

在 Django 的 custom_404_view 中,我們可以通過請求頭中的 Accept 標頭判斷用戶想要的返回類型:

  • Accept: application/json:請求 API,返回 JSON。
  • Accept: text/html 或無 Accept 標頭:請求 HTML,返回錯誤頁面。

實現邏輯

  1. 檢查 request.headers.get("Accept")
  2. 如果包含 application/json,返回 JSON。
  3. 否則,返回 HTML 模板。

如果只需要支持 API

在某些專注於 API 的項目中(如純後端服務),可以簡化錯誤處理邏輯,只返回 JSON 格式的錯誤信息:

簡化版邏輯

from django.http import JsonResponse

def custom_404_view(request, exception):
    return JsonResponse({
        "error": "Page not found",
        "status_code": 404,
        "detail": "The requested URL was not found on this server."
    }, status=404)

在這種情況下,瀏覽器和 API 客戶端都會看到相同的 JSON 格式錯誤信息。


HTML 作為備用方案

HTML 的作用

  • 當用戶使用瀏覽器直接訪問錯誤的 URL 時,HTML 提供了一個直觀的界面,告訴用戶「頁面不存在」。
  • 與 JSON 錯誤相比,HTML 更適合普通用戶。

API 安全性的考慮

  • 雖然 API 的路徑通常不會被普通用戶直接訪問,但仍然需要做好安全措施,例如:
    1. 身份驗證:保證只有授權的用戶可以訪問 API。
    2. 速率限制:防止濫用 API。
    3. 隱藏敏感數據:即使是錯誤信息,也應避免洩露內部結構。

結論與建議

  1. 兼容 API 和 HTML 錯誤
    • 對於大多數項目,建議支持 JSON 和 HTML 兩種返回格式,提升靈活性和用戶體驗。
    • 根據 Accept 標頭自動適配響應類型。
  2. 僅支持 API 的情況
    • 如果項目完全基於 API,則可以簡化處理邏輯,只返回 JSON 格式的錯誤信息。
  3. 安全與用戶體驗並重
    • API 的錯誤信息應避免洩露後端內部結構。
    • HTML 錯誤頁應直觀且易懂,為普通用戶提供清晰的指引。

希望本文能幫助你理解為什麼需要在 404 錯誤處理中支持 API 和 HTML!如果還有疑問,隨時向我提問! 😊

Similar Posts

發佈留言

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