Django小技巧21: 使用重定向

翻譯整理自: simpleisbetterthancomplex.com

Django 附帶了一組可以輕鬆安裝的可選模塊, 其中一個模塊就是重定向的模塊, 它在您想要更新某些現有URL而不損害您的網站SEO或在任何情況下避免404錯誤的情況下特別有用。

比如我現有的 URL 是

url

/tips/2017/08/11/django-tip-21.html

在某一次更新之後 URL 有變動變成了:

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.pyINSTALLED_APPS來添加到項目中。

settings.py

Python

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_IDsites框架能夠工作.

settings.py

Python

SITE_ID = 1

現在將redirects的中間件添加到MIDDLEWARE

settings.py

Python

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創建所需要的表:

Bash

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來完成:

Bash

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 條目的示例代碼:

Python

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

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":"/"
      }
   }
]

然後通過命令將其加載到數據庫

Bash

python manage.py loaddata redirects-fixtures.json
Installed 2 object(s) from 1 fixture(s)

就是這樣~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章