在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 相关文章推荐
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
python3编码问题汇总
Sep 06 Python
python实现朴素贝叶斯分类器
Mar 28 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
Django配置文件代码说明
Dec 04 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
python不同系统中打开方法
Jun 23 Python
一文详述 Python 中的 property 语法
Sep 01 Python
详解Java中一维、二维数组在内存中的结构
Feb 11 Python
使用pycharm运行flask应用程序的详细教程
Jun 07 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 preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
基于Python绘制个人足迹地图
2020/06/01 Python
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
教师党员承诺书
2014/03/25 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
安全生产标语
2014/06/06 职场文书
担保贷款承诺书
2015/04/30 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
如何有效防止sql注入的方法
2021/05/25 SQL Server