在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脚本暴力破解栅栏密码
Oct 19 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
python编程羊车门问题代码示例
Oct 25 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
python实现诗歌游戏(类继承)
Feb 26 Python
元组列表字典(莫烦python基础)
Apr 03 Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 Python
python mysql中in参数化说明
Jun 05 Python
Python 字典中的所有方法及用法
Jun 10 Python
Python如何自动获取目标网站最新通知
Jun 18 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 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
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
浅谈sass在vue注意的地方
2017/08/10 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
Python 文件读写操作实例详解
2014/03/12 Python
Python实现高效求解素数代码实例
2015/06/30 Python
python使用多进程的实例详解
2018/09/19 Python
浅析python参数的知识点
2018/12/10 Python
python实现取余操作的简单实例
2020/08/16 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
个人优缺点自我评价
2014/01/27 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
运动会班级前导词
2015/07/20 职场文书