在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 生成目录树及显示文件大小的代码
Jul 23 Python
Python多线程编程(四):使用Lock互斥锁
Apr 05 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
Python对列表中的各项进行关联详解
Aug 15 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
Python3enumrate和range对比及示例详解
Jul 13 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
python 连续不等式语法糖实例
Apr 15 Python
Python unittest单元测试框架实现参数化
Apr 29 Python
python绘制分布折线图的示例
Sep 24 Python
TensorFlow的自动求导原理分析
May 26 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动态生成函数示例
2014/03/21 PHP
php实现文件预览功能
2017/05/23 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
Python中encode()方法的使用简介
2015/05/18 Python
python版本单链表实现代码
2018/09/28 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
CSS3 分类菜单效果
2019/05/27 HTML / CSS
企业安全生产责任书
2014/04/14 职场文书
合作与交流自我评价
2015/03/09 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
python数字图像处理之图像的批量处理
2022/06/28 Python