详解如何用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目录操作之python遍历文件夹后将结果存储为xml
Jan 27 Python
python实现获取客户机上指定文件并传输到服务器的方法
Mar 16 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
python tkinter基本属性详解
Sep 16 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
python opencv通过按键采集图片源码
May 20 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调用mysql数据 dbclass类
2011/05/07 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
Python文件操作类操作实例详解
2014/07/11 Python
python批量同步web服务器代码核心程序
2014/09/01 Python
python使用分治法实现求解最大值的方法
2015/05/12 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
高性能装备提升营地:Kammok
2019/02/27 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
求职简历中个人的自我评价
2013/12/25 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
领导视察通讯稿
2015/07/18 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
Go语言 详解net的tcp服务
2022/04/14 Golang