详解如何用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中的序列化存储的方法
Apr 28 Python
详解C++编程中一元运算符的重载
Jan 19 Python
django 常用orm操作详解
Sep 13 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
基于python实现高速视频传输程序
May 05 Python
三步实现Django Paginator分页的方法
Jun 11 Python
安装好Pycharm后如何配置Python解释器简易教程
Jun 28 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
numpy的Fancy Indexing和array比较详解
Jun 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
PHP 引用是个坏习惯
2010/03/12 PHP
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
Python统计单词出现的次数
2018/04/04 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
会计助理岗位职责
2014/02/17 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
感恩之星事迹材料
2014/05/03 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
消防志愿者活动方案
2014/08/23 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
联村联户简报
2015/07/21 职场文书
护理心得体会范文
2016/01/22 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python