在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 相关文章推荐
github配置使用指南
Nov 18 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
Python模块WSGI使用详解
Feb 02 Python
python实现朴素贝叶斯分类器
Mar 28 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
python 如何对logging日志封装
Dec 02 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
pandas 按日期范围筛选数据的实现
Feb 20 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
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
浅谈JS运算符&&和|| 及其优先级
2016/08/10 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
Python中的类与类型示例详解
2019/07/10 Python
如何在python中实现线性回归
2020/08/10 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
init进程的作用
2012/04/12 面试题
中文教师求职信
2014/02/22 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
申报材料格式
2014/12/30 职场文书
医生辞职信范文
2015/03/02 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书