在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 del()函数用法
Mar 24 Python
Python下线程之间的共享和释放示例
May 04 Python
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
python3转换code128条形码的方法
Apr 17 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
详解Pycharm与anaconda安装配置指南
Aug 25 Python
python中yield的用法详解
Jan 13 Python
用python制作个视频下载器
Feb 01 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数字型字符串加解密代码
2008/04/24 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
Python os模块介绍
2014/11/30 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
Python实现数值积分方式
2019/11/20 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
python如何支持并发方法详解
2020/07/25 Python
Python如何读写CSV文件
2020/08/13 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
外贸专业求职信
2014/03/09 职场文书
环境建设实施方案
2014/03/14 职场文书
机关搬迁方案
2014/05/18 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
烈士陵园观后感
2015/06/08 职场文书
公司庆典主持词
2015/07/04 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书