在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实现建立SSH连接的方法
Jun 03 Python
Python编码类型转换方法详解
Jul 01 Python
Python安装Flask环境及简单应用示例
May 03 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
Python虚拟环境的创建和使用详解
Sep 07 Python
用python批量下载apk
Dec 29 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
Python基础知识之变量的详解
Apr 14 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 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
输出控制类
2006/10/09 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
curl 出现错误的调试方法(必看)
2017/02/13 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python的多态性实例分析
2015/07/07 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
创意爱尔兰礼物:Creative Irish Gifts
2020/01/29 全球购物
财务主管岗位职责
2014/02/28 职场文书
小学六年级学生评语
2014/04/22 职场文书
销售口号大全
2014/06/11 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
家长给老师的感谢信
2015/01/20 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
家访教师心得体会
2016/01/23 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python