在Python的Django框架中使用通用视图的方法


Posted in Python onJuly 21, 2015

使用通用视图的方法是在URLconf文件中创建配置字典,然后把这些字典作为URLconf元组的第三个成员。

例如,下面是一个呈现静态“关于”页面的URLconf:

from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
  (r'^about/$', direct_to_template, {
    'template': 'about.html'
  })
)

一眼看上去似乎有点不可思议,不需要编写代码的视图! 它和第八章中的例子完全一样:direct_to_template视图仅仅是直接从传递过来的额外参数获取信息并用于渲染视图。

因为通用视图都是标准的视图函数,我们可以在我们自己的视图中重用它。 例如,我们扩展 about例子,把映射的URL从 /about//修改到一个静态渲染 about/.html 。 我们首先修改URL配置以指向新的视图函数:

from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template
**from mysite.books.views import about_pages**

urlpatterns = patterns('',
  (r'^about/$', direct_to_template, {
    'template': 'about.html'
  }),
  **(r'^about/(\w+)/$', about_pages),**
)

接下来,我们编写 about_pages 视图的代码:

from django.http import Http404
from django.template import TemplateDoesNotExist
from django.views.generic.simple import direct_to_template

def about_pages(request, page):
  try:
    return direct_to_template(request, template="about/%s.html" % page)
  except TemplateDoesNotExist:
    raise Http404()

在这里我们象使用其他函数一样使用 direct_to_template 。 因为它返回一个HttpResponse对象,我们只需要简单的返回它就好了。 这里唯一有点棘手的事情是要处理找不到模板的情况。 我们不希望一个不存在的模板导致一个服务端错误,所以我们捕获TemplateDoesNotExist异常并且返回404错误来作为替代。

这里有没有安全性问题?

眼尖的读者可能已经注意到一个可能的安全漏洞: 我们直接使用从客户端浏览器得到的数据构造模板名称(template="about/%s.html" % page )。乍看起来,这像是一个经典的 目录跨越(directory traversal) 攻击(详情请看第20章)。 事实真是这样吗?

完全不是。 是的,一个恶意的 page 值可以导致目录跨越,但是尽管 page 是 从请求的URL中获取的,但并不是所有的值都会被接受。 这就是URL配置的关键所在: 我们使用正则表达式 \w+ 来从URL里匹配 page ,而 \w 只接受字符和数字。 因此,任何恶意的字符 (例如在这里是点 . 和正斜线 / )将在URL解析时被拒绝,根本不会传递给视图函数。

Python 相关文章推荐
Django的URLconf中使用缺省视图参数的方法
Jul 18 Python
Python数据结构之图的应用示例
May 11 Python
Python基于property实现类的特性操作示例
Jun 15 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python2和Python3.6环境解决共存问题
Nov 09 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
python logging添加filter教程
Dec 24 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
python实现简单区块链结构
Apr 25 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 #Python
在Django的模型中添加自定义方法的示例
Jul 21 #Python
详解Python的Django框架中Manager方法的使用
Jul 21 #Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 #Python
通过数据库向Django模型添加字段的示例
Jul 21 #Python
Django的数据模型访问多对多键值的方法
Jul 21 #Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 #Python
You might like
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
IStream与TStream之间的相互转换
2008/08/01 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
Javascript之String对象详解
2016/06/08 Javascript
react redux入门示例
2018/04/19 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
python中redis的安装和使用
2016/12/04 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
python实现画图工具
2020/08/27 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
创立科技Java面试题
2015/11/29 面试题
幼儿园园长自我鉴定
2013/10/22 职场文书
银行内勤岗位职责
2014/04/09 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
地方白酒代理协议书
2014/10/25 职场文书
怎样写离婚协议书
2015/01/26 职场文书
股份转让协议书范本
2015/01/27 职场文书
英文产品推荐信
2015/03/27 职场文书
开除通知书范本
2015/04/25 职场文书
python之基数排序的实现
2021/07/26 Python
vue使用echarts实现折线图
2022/03/21 Vue.js