详解如何用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 13 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
python实现二分查找算法
Sep 21 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
详解Python_shutil模块
Mar 15 Python
Pytorch to(device)用法
Jan 08 Python
Pygame的程序开始示例代码
May 07 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
python mock测试的示例
Oct 19 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
python Pexpect模块的使用
Dec 25 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
FleaPHP的安全设置方法
2008/09/15 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
小程序云开发初探(小结)
2018/10/24 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python学生管理系统学习笔记
2019/03/19 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
python中的django是做什么的
2020/07/31 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
python中altair可视化库实例用法
2021/01/26 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
给面试官的感谢信
2014/02/01 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
三八妇女节寄语
2015/02/27 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle