在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之有容乃大的list(3)
Sep 15 Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Django原生sql也能使用Paginator分页的示例代码
Nov 15 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
python中自带的三个装饰器的实现
Nov 08 Python
Python 限定函数参数的类型及默认值方式
Dec 24 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 Python
聊聊Python String型列表求最值的问题
Jan 18 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/07/12 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
js与运算符和或运算符的妙用
2014/02/14 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
python Django批量导入不重复数据
2016/03/25 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
python3多线程知识点总结
2019/09/26 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
python如何删除文件、目录
2020/06/23 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
编辑个人求职信范文
2013/09/21 职场文书
工业设计专业推荐信
2013/10/29 职场文书
办公室内勤工作职责
2013/12/11 职场文书
护士进修自我鉴定
2014/02/07 职场文书
2015年导购员工作总结
2015/04/25 职场文书
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android