详解如何用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中cPickle用法例子分享
Jan 03 Python
Python中获取网页状态码的两个方法
Nov 03 Python
Python实现通讯录功能
Feb 22 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
Python实现二叉搜索树BST的方法示例
Jul 30 Python
python爬虫中多线程的使用详解
Sep 23 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
Python内置加密模块用法解析
Nov 25 Python
基于Tensorflow高阶读写教程
Feb 10 Python
keras的siamese(孪生网络)实现案例
Jun 12 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
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
php7 新增功能实例总结
2020/05/25 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
JavaScript 事件查询综合
2009/07/13 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
jQuery和JavaScript节点插入元素的方法对比
2016/11/18 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
详解Django中的过滤器
2015/07/16 Python
python实现抖音视频批量下载
2018/06/20 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
致跳高运动员广播稿
2014/01/13 职场文书
服务承诺书格式
2014/05/21 职场文书
文明生主要事迹
2014/05/25 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
违章停车检讨书
2014/10/21 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
小学数学国培研修日志
2015/11/13 职场文书
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript