重新導向應用程式

Django 附帶一個可選的重新導向應用程式。它可以讓您將重新導向儲存在資料庫中,並為您處理重新導向。預設情況下,它使用 HTTP 回應狀態碼 301 Moved Permanently

安裝

要安裝重新導向應用程式,請按照以下步驟操作

  1. 確保 django.contrib.sites 框架 已安裝

  2. 'django.contrib.redirects' 加入到您的 INSTALLED_APPS 設定中。

  3. 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' 加入到您的 MIDDLEWARE 設定中。

  4. 執行命令 manage.py migrate

運作方式

manage.py migrate 會在您的資料庫中建立一個 django_redirect 表格。這是一個包含 site_idold_pathnew_path 欄位的查找表格。

RedirectFallbackMiddleware 完成所有工作。每次任何 Django 應用程式引發 404 錯誤時,此中介軟體會檢查重新導向資料庫中是否有要求的 URL 作為最後手段。具體來說,它會檢查是否有給定 old_path 的重新導向,其網站 ID 與 SITE_ID 設定相對應。

  • 如果它找到匹配項,並且 new_path 不為空,則它會使用 301 (“Moved Permanently”) 重新導向到 new_path。您可以將 RedirectFallbackMiddleware 子類化,並將 response_redirect_class 設定為 django.http.HttpResponseRedirect,改為使用 302 Moved Temporarily 重新導向。

  • 如果它找到匹配項,並且 new_path 為空,則它會傳送 410 (“Gone”) HTTP 標頭和空的 (無內容) 回應。

  • 如果它找不到匹配項,則請求會像往常一樣繼續處理。

中介軟體僅針對 404 錯誤啟動,而不是針對 500 錯誤或任何其他狀態碼的回應。

請注意,MIDDLEWARE 的順序很重要。一般來說,您可以將 RedirectFallbackMiddleware 放在清單的末尾,因為它是最後的手段。

有關中介軟體的更多資訊,請閱讀 中介軟體文件

如何新增、變更和刪除重新導向

透過管理介面

如果您已啟動自動 Django 管理介面,您應該會在管理索引頁面上看到一個「重新導向」區段。像編輯系統中的任何其他物件一樣編輯重新導向。

透過 Python API

class models.Redirect

重新導向由標準的 Django 模型 表示,該模型位於 django/contrib/redirects/models.py 中。您可以透過 Django 資料庫 API 存取重新導向物件。例如

>>> from django.conf import settings
>>> from django.contrib.redirects.models import Redirect
>>> # Add a new redirect.
>>> redirect = Redirect.objects.create(
...     site_id=1,
...     old_path="/contact-us/",
...     new_path="/contact/",
... )
>>> # Change a redirect.
>>> redirect.new_path = "/contact-details/"
>>> redirect.save()
>>> redirect
<Redirect: /contact-us/ ---> /contact-details/>
>>> # Delete a redirect.
>>> Redirect.objects.filter(site_id=1, old_path="/contact-us/").delete()
(1, {'redirects.Redirect': 1})

中介軟體

class middleware.RedirectFallbackMiddleware

您可以透過建立 RedirectFallbackMiddleware 的子類別並覆寫 response_gone_class 和/或 response_redirect_class 來變更中介軟體使用的 HttpResponse 類別。

response_gone_class

當找不到要求的路徑的 Redirect,或 new_path 值為空白時,使用的 HttpResponse 類別。

預設為 HttpResponseGone

response_redirect_class

處理重新導向的 HttpResponse 類別。

預設為 HttpResponsePermanentRedirect

返回頂端