详解如何用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 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
python FTP批量下载/删除/上传实例
Dec 22 Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 Python
在Python中实现字典反转案例
Dec 05 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
用python 绘制茎叶图和复合饼图
Feb 26 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
Bootstrap表格制作代码
2017/03/17 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
python中使用enumerate函数遍历元素实例
2014/06/16 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
分析python请求数据
2018/08/19 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
pandas分组聚合详解
2020/04/10 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
python文件排序的方法总结
2020/09/13 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
html5 web本地存储将取代我们的cookie
2012/12/26 HTML / CSS
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
外贸业务员岗位职责
2013/11/24 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
务工证明怎么写
2015/06/18 职场文书
通讯稿范文
2015/07/22 职场文书
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL