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)

就是这样~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏kevin-blog

beef漏洞利用框架安装.md

BeEF是目前欧美最流行的web框架攻击平台,它的全称是 the Browser exploitation framework project.最近两年国外各种...

1062
来自专栏SHERlocked93的前端小站

几种浏览器存储方法及其优缺点

在做项目的过程中,我们经常遇到需要把信息存储在本地的情况,比如权限验证的token、用户信息、埋点计数、客户配置的皮肤信息或语言种类等,我们可以暂存一下避免浏览...

1K4
来自专栏黑白安全

用Burpsuite测试移动应用程序

保护移动应用程序是当今最重要的问题之一, 因此,对移动应用程序的测试已成为一种必要性,不仅向客户提供足够的安全性,而且向公司提供足够的安全性。

923
来自专栏高爽的专栏

Session深度解析

第 1 章 简介 1. 广义的session        中文名称会话,Http客户端和Http服务器开始通信,就会产生会话,会话过程是可以连续的,也可以是时...

2090
来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

四、xadmin后台管理

然后运行脚本 import_category_data.py  数据就可以保存到数据库了

6350
来自专栏运维小白

11.23 访问日志切割

访问日志切割目录概要 日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件 把虚拟主机配置文件改成如下: <VirtualHost...

20610
来自专栏weixuqin 的专栏

Django 实现上传图片功能

  很多时候我们要用到图片上传功能,如果图片一直用放在别的网站上,通过加载网址的方式来显示的话其实也挺麻烦的,我们通过使用 django-filer 这个模块实...

1262
来自专栏Timhbw博客

学习提升之HTTP状态码详解

2016-11-1410:23:53 发表评论 315℃热度 1.URL 2.URL中常见的协议 3.TCP/IP协议簇 4.TCP/IP参考模型 ...

3466
来自专栏企鹅号快讯

Spring Security源码分析:Spring Security请记住我

有这样一个场景——有个用户初访并登录了你的网站,然而第二天他又来了,却必须再次登录。于是就有了“记住我”这样的功能来方便用户使用,然而有一件不言自明的事情,那就...

25410
来自专栏菩提树下的杨过

Spring Security笔记:Remember Me(下次自动登录)

前一节学习了如何限制登录尝试次数,今天在这个基础上再增加一点新功能:Remember Me. 很多网站,比如博客园,在登录页面就有这个选项,勾选“下次自动登录”...

4126

扫码关注云+社区

领取腾讯云代金券