重新導向應用程式¶
Django 附帶一個可選的重新導向應用程式。它可以讓您將重新導向儲存在資料庫中,並為您處理重新導向。預設情況下,它使用 HTTP 回應狀態碼 301 Moved Permanently
。
安裝¶
要安裝重新導向應用程式,請按照以下步驟操作
確保
django.contrib.sites
框架 已安裝。將
'django.contrib.redirects'
加入到您的INSTALLED_APPS
設定中。將
'django.contrib.redirects.middleware.RedirectFallbackMiddleware'
加入到您的MIDDLEWARE
設定中。執行命令
manage.py migrate
。
運作方式¶
manage.py migrate
會在您的資料庫中建立一個 django_redirect
表格。這是一個包含 site_id
、old_path
和 new_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
類別。