详解如何用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算法学习之基数排序实例
Dec 18 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
使用python实现生成用户信息
Mar 20 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
对python 合并 累加两个dict的实例详解
Jan 21 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
Django Celery异步任务队列的实现
Jul 24 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
python实现定时发送邮件
Dec 23 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去除字符串中空字符的常用方法小结
2015/03/17 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
python中多个装饰器的调用顺序详解
2019/07/16 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
python实现单链表的方法示例
2019/09/03 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
python绘制玫瑰的实现代码
2020/03/02 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
金士达面试非笔试
2012/03/14 面试题
办公室副主任职责范本
2014/03/08 职场文书
团队经理竞聘书
2014/03/31 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
劳资员岗位职责
2015/02/13 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
Python list列表删除元素的4种方法
2021/11/01 Python
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript