Django 原生自帶一個(gè)可選的重定向應(yīng)用。它將簡(jiǎn)單的重定向保存到數(shù)據(jù)庫(kù)中并處理重定向。它默認(rèn)使用HTTP 響應(yīng)狀態(tài)碼301 Moved Permanently。
請(qǐng)依照下面的步驟安裝重定向應(yīng)用:
django.contrib.sites 框架已經(jīng)安裝。django.contrib.redirects' 到 INSTALLED_APPS 設(shè)置中。django.contrib.redirects.middleware.RedirectFallbackMiddleware' 到MIDDLEWARE_CLASSES 設(shè)置中。manage.py migrate。manage.py migrate 在數(shù)據(jù)庫(kù)中創(chuàng)建一張django_redirect 表。它是一張簡(jiǎn)單的查詢表,具有site_id、old_path 和new_path 字段。
RedirectFallbackMiddleware 完成所有的工作。每當(dāng)Django 的應(yīng)用引發(fā)一個(gè)404 錯(cuò)誤,該中間件將到重定向數(shù)據(jù)庫(kù)中檢查請(qǐng)求的URL。它會(huì)根據(jù)old_path 和SITE_ID 設(shè)置的站點(diǎn)ID 查找重定向的路徑。
new_path不為空,它將使用301(“Moved Permanently”)重定向到new_path 。你可以子類化RedirectFallbackMiddleware 并設(shè)置 response_redirect_class 為django.http.HttpResponseRedirect 來(lái)使用302 Moved Temporarily 重定向。new_path 為空,它將發(fā)送一個(gè)410 (“Gone”) HTTP 頭和空(沒有內(nèi)容的)響應(yīng)。這個(gè)中間件只針對(duì)404 錯(cuò)誤啟用 —— 不能用于500 或其它狀態(tài)碼。
注意MIDDLEWARE_CLASSES 的順序很重要。通??梢詫?code>RedirectFallbackMiddleware 放在列表的最后,因?yàn)樗詈髨?zhí)行。
更多的信息可以閱讀中間件的文檔。
如果你已經(jīng)啟用Django 自動(dòng)生成的Admin 接口,你應(yīng)該可以在Admin 的主頁(yè)看到“Redirects”部分。編輯這些重定向,就像編輯系統(tǒng)中的其它對(duì)象一樣。
class models.Redirect
重定向通過(guò)一個(gè)標(biāo)準(zhǔn)的Django 模型表示,位于django/contrib/redirects/models.py。你可以通過(guò)Django 的數(shù)據(jù)庫(kù)API 訪問重定向?qū)ο蟆?/p>
class middleware.RedirectFallbackMiddleware
你可以通過(guò)創(chuàng)建RedirectFallbackMiddleware 的子類并覆蓋response_gone_class 和/或response_redirect_class 來(lái)修改中間件使用的HttpResponse類。
response_gone_class
New in Django 1.7.
HttpResponse 類,用于找不到請(qǐng)求路徑的Redirect或找到的new_path 值為空的時(shí)候。
默認(rèn)為HttpResponseGone。
response_redirect_class
New in Django 1.7.
處理重定向的HttpResponse 類。
默認(rèn)為HttpResponsePermanentRedirect。
譯者:Django 文檔協(xié)作翻譯小組,原文:Redirects。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。