在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文件和目录操作方法大全(含实例)
Mar 12 Python
利用Python生成文件md5校验值函数的方法
Jan 10 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
深入理解Python中range和xrange的区别
Nov 26 Python
Python实现的rsa加密算法详解
Jan 24 Python
Python使用Shelve保存对象方法总结
Jan 28 Python
Python实现定时执行任务的三种方式简单示例
Mar 30 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
Django中celery的使用项目实例
Jul 07 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
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
php类自动加载器实现方法
2015/07/28 PHP
PHP实现递归无限级分类
2015/10/22 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
推荐下python/ironpython:从入门到精通
2007/10/02 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
python缩进长度是否统一
2020/08/02 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
美国性感女装网站:bebe
2017/03/04 全球购物
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
请解释在new与override的区别
2012/10/29 面试题
应聘收银员个人的求职信
2013/11/30 职场文书
人事部岗位职责范本
2014/03/05 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
中学生运动会口号
2014/06/07 职场文书
法人代表证明书
2014/09/18 职场文书
停车场管理协议书范本
2014/10/08 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书