在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设计模式之观察者模式实例
Apr 26 Python
python 性能提升的几种方法
Jul 15 Python
Python实现按特定格式对文件进行读写的方法示例
Nov 30 Python
Python实现的简单排列组合算法示例
Jul 04 Python
Python实现随机漫步功能
Jul 09 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
django settings.py 配置文件及介绍
Jul 15 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
树型结构列出指定目录里所有文件的PHP类
2006/10/09 PHP
PHP 读取和编写 XML
2014/11/19 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
全面了解python字符串和字典
2016/07/07 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
简单了解Django模板的使用
2017/12/20 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
python中@contextmanager实例用法
2021/02/07 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
思想政治自我鉴定
2013/10/06 职场文书
妈妈的账单教学反思
2014/02/06 职场文书
爱情保证书大全
2014/04/29 职场文书
学生安全承诺书
2014/05/22 职场文书
五五普法心得体会
2014/09/04 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书