Django 附帶了一組可以輕鬆安裝的可選模塊, 其中一個模塊就是重定向的模塊, 它在您想要更新某些現有URL而不損害您的網站SEO或在任何情況下避免404錯誤的情況下特別有用。
比如我現有的 URL 是
/tips/2017/08/11/django-tip-21.html
在某一次更新之後 URL 有變動變成了:
/tips/redirects-app/
而且我原有 URL, 已經被搜索引擎收錄. 我不想在用戶通過搜索引擎點過來是404頁面。 這時候就需要做重定向到新的地址
redirects 模塊是通過在數據庫中創建一張表, 包含兩個字段(old_path和new_path)來實現的.每當你的項目出現404錯誤的時候,redirects 組件將會攔截404響應, 並檢索特定的 table 進行匹配, 如果在特定的 table 中匹配到old_path ,將會重定向到所綁定的new_path. 不會返回404, 而返回一個301響應(Moved Permanently).
OK, 讓我看看redirects在實踐中如何執行
安裝
Django redirects 組件需要安裝sites框架. 通過settings.py的INSTALLED_APPS來添加到項目中。
settings.py
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'django.contrib.redirects', ]
設置SITE_ID
讓sites框架能夠工作.
settings.py
SITE_ID = 1
現在將redirects的中間件添加到MIDDLEWARE
settings.py
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', ]
通過migrate創建所需要的表:
python manage.py migrate
使用
最簡單的方式通過 Django Admin 來對這個表添加記錄. 如果你沒有 Django Admin, 並且此操作是一次性的事情, 你可以通過redirects的 Python API 或者創建一個fixture. 如果你不使用Django Admin 但這個不是一次性的事情, 需要後面維護更新這個表, 那麼你需要創建一個自己的視圖管理頁面.
通過DjangoAdmin管理redirects
默認情況下, 安裝後會自動加到 Django Admin 界面
#Django Admin 管理 redirects
只需添加對應的路徑, redirects組件將會自動完成這個重定向工作
#redirects table
你可以通過瀏覽器來訪問舊的路徑, 看看他是否能夠正常的重定向. 另一種方法是檢測響應的body, 可以通過curl
來完成:
curl --head 127.0.0.1:8000/tips/2017/08/11/django-tip-21.html HTTP/1.0 301 Moved Permanently Date: Fri, 11 Aug 2017 15:42:27 GMT Server: WSGIServer/0.2 CPython/3.6.1 Content-Type: text/html; charset=utf-8 Location: /tips/redirects-app/ X-Frame-Options: SAMEORIGIN Content-Length: 0
通過Python API管理redirects
你可以通過 Django ORM 來對 redirects 的 Model 進行操作管理. 它位於django/contrib/redirects/models.py.
以下是創建redirects 條目的示例代碼:
from django.contrib.redirects.models import Redirect from django.contrib.sites.models import Site from django.conf import settings site = Site.objects.get(pk=settings.SITE_ID) Redirect.objects.create(site=site, old_path='/index.html', new_path='/') Redirect.objects.create(site=site, old_path='/tips/2017/08/11/django-tip-21.html', new_path='/tips/redirects-app/')
通過Fixtures導入redirects
關於Fixtures, 是 Django 提供的一個功能, 可以到這裏查看文檔瞭解更多.
首先按照以下示例的模板創建 JSON 文件
redirects-fixture.json
[ { "model":"redirects.redirect", "fields":{ "site":1, "old_path":"/tips/2017/08/11/django-tip-21.html", "new_path":"/tips/redirects-app/" } }, { "model":"redirects.redirect", "fields":{ "site":1, "old_path":"/index.html", "new_path":"/" } } ]
然後通過命令將其加載到數據庫
python manage.py loaddata redirects-fixtures.json Installed 2 object(s) from 1 fixture(s)
就是這樣~