在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的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
Python使用pymysql小技巧
Jun 04 Python
对python Tkinter Text的用法详解
Oct 11 Python
python实现归并排序算法
Nov 22 Python
python-opencv颜色提取分割方法
Dec 08 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
python中的decimal类型转换实例详解
Jun 26 Python
详解用python计算阶乘的几种方法
Aug 14 Python
python计算n的阶乘的方法代码
Oct 25 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
基于python使用tibco ems代码实例
Dec 20 Python
python+opencv实现目标跟踪过程
Jun 21 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中“简单工厂模式”实例代码讲解
2012/09/04 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
JS代码格式化和语法着色V2
2006/10/14 Javascript
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
IE autocomplete internet explorer's autocomplete
2007/06/30 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
python3生成随机数实例
2014/10/20 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
Java程序员常见面试题
2015/07/16 面试题
服装机修工岗位职责
2013/12/26 职场文书
电焊工工作岗位职责
2014/02/06 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
业务内勤岗位职责
2014/04/30 职场文书
经营目标管理责任书
2014/07/25 职场文书
社区两委对照检查材料
2014/08/23 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
2014年后勤工作总结
2014/11/18 职场文书
教务处干事工作总结
2015/08/14 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸