在Python的Django框架中调用方法和处理无效变量


Posted in Python onJuly 15, 2015

方法调用行为

方法调用比其他类型的查找略为复杂一点。 以下是一些注意事项:

    在方法查找过程中,如果某方法抛出一个异常,除非该异常有一个 silent_variable_failure 属性并且值为 True ,否则的话它将被传播。如果异常被传播,模板里的指定变量会被置为空字符串,比如:

>>> t = Template("My name is {{ person.first_name }}.")
>>> class PersonClass3:
...   def first_name(self):
...     raise AssertionError, "foo"
>>> p = PersonClass3()
>>> t.render(Context({"person": p}))
Traceback (most recent call last):
...
AssertionError: foo

>>> class SilentAssertionError(AssertionError):
...   silent_variable_failure = True
>>> class PersonClass4:
...   def first_name(self):
...     raise SilentAssertionError
>>> p = PersonClass4()
>>> t.render(Context({"person": p}))
u'My name is .'

    仅在方法无需传入参数时,其调用才有效。 否则,系统将会转移到下一个查找类型(列表索引查找)。

    显然,有些方法是有副作用的,好的情况下允许模板系统访问它们可能只是干件蠢事,坏的情况下甚至会引发安全漏洞。

    例如,你的一个 BankAccount 对象有一个 delete() 方法。 如果某个模板中包含了像 {{ account.delete }}这样的标签,其中`` account`` 又是BankAccount 的一个实例,请注意在这个模板载入时,account对象将被删除。

    要防止这样的事情发生,必须设置该方法的 alters_data 函数属性:

def delete(self):
  # Delete the account
delete.alters_data = True

    模板系统不会执行任何以该方式进行标记的方法。 接上面的例子,如果模板文件里包含了 {{ account.delete }} ,对象又具有 delete()方法,而且delete() 有alters_data=True这个属性,那么在模板载入时, delete()方法将不会被执行。 它将静静地错误退出。

如何处理无效变量

默认情况下,如果一个变量不存在,模板系统会把它展示为空字符串,不做任何事情来表示失败。 例如:

>>> from django.template import Template, Context
>>> t = Template('Your name is {{ name }}.')
>>> t.render(Context())
u'Your name is .'
>>> t.render(Context({'var': 'hello'}))
u'Your name is .'
>>> t.render(Context({'NAME': 'hello'}))
u'Your name is .'
>>> t.render(Context({'Name': 'hello'}))
u'Your name is .'

系统静悄悄地表示失败,而不是引发一个异常,因为这通常是人为错误造成的。 这种情况下,因为变量名有错误的状况或名称, 所有的查询都会失败。 现实世界中,对于一个web站点来说,如果仅仅因为一个小的模板语法错误而造成无法访问,这是不可接受的。

Python 相关文章推荐
基于Python实现的微信好友数据分析
Feb 26 Python
Sanic框架路由用法实例分析
Jul 16 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
python读取xlsx的方法
Dec 25 Python
Python 数据库操作 SQLAlchemy的示例代码
Feb 18 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
django的csrf实现过程详解
Jul 26 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
pytorch fine-tune 预训练的模型操作
Jun 03 Python
python实现判断数组是否包含指定元素的方法
Jul 15 #Python
python获取元素在数组中索引号的方法
Jul 15 #Python
Django框架中方法的访问和查找
Jul 15 #Python
Python的Django框架中的Context使用
Jul 15 #Python
在Python的Django框架中创建和使用模版
Jul 15 #Python
详解Python的Django框架中的模版相关知识
Jul 15 #Python
Django中处理出错页面的方法
Jul 15 #Python
You might like
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
财务管理专业毕业生求职信范文
2013/09/21 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
银行员工考核评语
2014/12/31 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
雷锋电影观后感
2015/06/10 职场文书
班级班风口号大全
2015/12/25 职场文书