在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 相关文章推荐
python编程开发之类型转换convert实例分析
Nov 13 Python
详解Python中的__new__、__init__、__call__三个特殊方法
Jun 02 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
django框架使用方法详解
Jul 18 Python
Django实现简单网页弹出警告代码
Nov 15 Python
为什么说python适合写爬虫
Jun 11 Python
python代码区分大小写吗
Jun 17 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
python中温度单位转换的实例方法
Dec 27 Python
python 批量将中文名转换为拼音
Feb 07 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
十天学会php之第九天
2006/10/09 PHP
PHP4实际应用经验篇(3)
2006/10/09 PHP
php后门URL的防范
2013/11/12 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php猜单词游戏
2015/09/29 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
js实现漫天星星效果
2017/01/19 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
vue的常用组件操作方法应用分析
2018/04/13 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
2018/05/25 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
Python编码类型转换方法详解
2016/07/01 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
台湾三立电视电商平台:电电购
2019/09/09 全球购物
餐厅周年庆活动方案
2014/08/25 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
超市创业计划书
2014/09/15 职场文书
合作协议书范本
2014/10/25 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis