详解如何用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使用gensim计算文档相似性
Apr 10 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
python爬虫之自制英汉字典
Jun 24 Python
在pandas中遍历DataFrame行的实现方法
Oct 23 Python
使用python实现对元素的长截图功能
Nov 14 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Python 如何批量更新已安装的库
May 26 Python
如何使用Pytorch搭建模型
Oct 26 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
基于jquery的滚动新闻列表
2010/06/19 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
基于python爬虫数据处理(详解)
2017/06/10 Python
Python多层装饰器用法实例分析
2018/02/09 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
Python装饰器结合递归原理解析
2020/07/02 Python
Django配置跨域并开发测试接口
2020/11/04 Python
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
护理个人求职信范文
2014/01/08 职场文书
职业规划书如何设计?
2014/01/09 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
python使用glob检索文件的操作
2021/05/20 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python