在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和shell变量互相传递的几种方法
Nov 20 Python
python处理json数据中的中文
Mar 06 Python
python简单实现刷新智联简历
Mar 30 Python
多版本Python共存的配置方法
May 22 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
Jun 28 Python
简述python&pytorch 随机种子的实现
Oct 07 Python
python中opencv实现图片文本倾斜校正
Jun 11 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文件缓存内容保存格式实例分析
2014/08/20 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
php实现用户登陆简单实例
2017/04/04 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
使用Python从零开始撸一个区块链
2018/03/14 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
解决Python对齐文本字符串问题
2019/08/28 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python @property使用方法解析
2019/09/17 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
西班牙香水和化妆品连锁店:Druni
2019/05/05 全球购物
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
SQL数据库笔试题
2016/03/08 面试题
员工拾金不昧表扬信
2014/01/09 职场文书
高一英语教学反思
2014/01/22 职场文书
会计求职自荐信范文
2015/03/04 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
2015年共青团工作总结
2015/05/15 职场文书
百年孤独读书笔记
2015/06/29 职场文书
军训后的感想
2015/08/07 职场文书
高中语文教学反思范文
2016/02/16 职场文书
MySQL视图概念以及相关应用
2022/04/19 MySQL