详解如何用django实现redirect的几种方法总结


Posted in Python onNovember 22, 2018

用django开发web应用, 经常会遇到从一个旧的url转向一个新的url。这种隐射也许有规则,也许没有。但都是为了实现业务的需要。总体说来,有如下几种方法实现 django的 redirect。

1. 在url 中配置 redirect_to 或者 RedirectView(django 1.3 版本以上)
2. 在view 中 通过 HttpResponseRedirect 实现 redirect
3. 利用 django 的 redirects app实现

1 在url 中配置 redirect_to 或者 RedirectView(django 1.3 版本以上)

from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
  (r'^one/$', redirect_to, {'url': '/another/'}),
)

from django.views.generic import RedirectView
urlpatterns = patterns('',
  (r'^one/$', RedirectView.as_view(url='/another/')),
)

2. 在view 中 通过 HttpResponseRedirect 实现 redirect

from django.http import HttpResponseRedirect
 
def myview(request):
  ...
  return HttpResponseRedirect("/path/")

3. 利用 django 的 redirects app实现

1. 在settings.py 中  增加 'django.contrib.redirects' 到你的 INSTALLED_APPS 设置.
2. 增加 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' 到你的MIDDLEWARE_CLASSES 设置中.
3. 运行 manage.py syncdb. 创建 django_redirect 这个表,包含了 site_id, old_path and new_path 字段.

主要工作是 RedirectFallbackMiddleware  完成的,如果 django  发现了404 错误,这时候,就会进django_redirect 去查找,有没有匹配的URL 。如果有匹配且新的RUL不为空则自动转向新的URL,如果新的URL为空,则返回410. 如果没有匹配,仍然按原来的错误返回。

注意,这种仅仅处理 404 相关错误,而不是 500 错误的。

增加删除 django_redirect 表呢?

from django.db import models
from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import python_2_unicode_compatible
 
@python_2_unicode_compatible
class Redirect(models.Model):
  site = models.ForeignKey(Site)
  old_path = models.CharField(_('redirect from'), max_length=200, db_index=True,
    help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'."))
  new_path = models.CharField(_('redirect to'), max_length=200, blank=True,
    help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'."))
 
  class Meta:
    verbose_name = _('redirect')
    verbose_name_plural = _('redirects')
    db_table = 'django_redirect'
    unique_together=(('site', 'old_path'),)
    ordering = ('old_path',)
 
  def __str__(self):
    return "%s ---> %s" % (self.old_path, self.new_path)

采用类似如上的MODEL ,另外用DJANGO相关ORM 就可以实现save,delete了。

以上三种方法都可以实现 django redirect,其实最常用的,是第一种与第二种,第三种方法很少用。

Python 相关文章推荐
Python实现爬取逐浪小说的方法
Jul 07 Python
解读Django框架中的低层次缓存API
Jul 24 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
Python多进程原理与用法分析
Aug 21 Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
Python PO设计模式的具体使用
Aug 16 Python
用python画一只可爱的皮卡丘实例
Nov 21 Python
基于python实现把json数据转换成Excel表格
May 07 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 Python
PyGame贪吃蛇的实现代码示例
Nov 21 #Python
python+flask实现API的方法
Nov 21 #Python
python实现事件驱动
Nov 21 #Python
python事件驱动event实现详解
Nov 21 #Python
python程序封装为win32服务的方法
Mar 07 #Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 #Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 #Python
You might like
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
php bootstrap实现简单登录
2016/03/08 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
JS 控件事件小结
2012/10/31 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
jquery判断复选框是否被选中的方法
2015/10/16 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
Python中函数的参数传递与可变长参数介绍
2015/06/30 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
基于python中theano库的线性回归
2018/08/31 Python
python 获取url中的参数列表实例
2018/12/18 Python
Python中的 enum 模块源码详析
2019/01/09 Python
numpy基础教程之np.linalg
2019/02/12 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
年检委托书
2014/08/30 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
致青春观后感
2015/06/09 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书