在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判断字符串是否纯数字的方法
Nov 19 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python入门学习指南分享
Apr 11 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
Python读取stdin方法实例
May 24 Python
python调试神器PySnooper的使用
Jul 03 Python
pytorch-RNN进行回归曲线预测方式
Jan 14 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
python 绘制正态曲线的示例
Sep 24 Python
python 进程池pool使用详解
Oct 15 Python
利用Python过滤相似文本的简单方法示例
Feb 03 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
用php来检测proxy
2006/10/09 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python list转dict示例分享
2014/01/28 Python
python中from module import * 的一个坑
2014/07/20 Python
Python多线程下载文件的方法
2015/07/10 Python
Python实现的多进程拷贝文件并显示百分比功能示例
2019/04/09 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
python制作抽奖程序代码详解
2021/01/15 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
外贸销售员求职的自我评价
2013/11/23 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
投资协议书范本
2014/04/21 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
西游记读书笔记
2015/06/25 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python