在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中bisect的用法
Sep 23 Python
python自动格式化json文件的方法
Mar 11 Python
Python列表解析配合if else的方法
Jun 23 Python
Python装饰器模式定义与用法分析
Aug 06 Python
python利用pandas将excel文件转换为txt文件的方法
Oct 23 Python
python实现扫描ip地址的小程序
Apr 16 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
python反转列表的三种方式解析
Nov 08 Python
Python类的绑定方法和非绑定方法实例解析
Mar 04 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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获取从html表单传递数组的方法
2015/03/20 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
jquery实现的table排序功能示例
2017/03/10 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
python模拟实现分发扑克牌
2020/04/22 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
青春励志演讲稿
2014/04/29 职场文书
公司承诺书范文
2014/05/19 职场文书
设备售后服务承诺书
2014/05/30 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
使用HttpSessionListener监听器实战
2022/03/17 Java/Android