在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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
用Python实现一个简单的线程池
Apr 07 Python
Python常用随机数与随机字符串方法实例
Apr 09 Python
Python的多态性实例分析
Jul 07 Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
python如何在终端里面显示一张图片
Aug 17 Python
python:socket传输大文件示例
Jan 18 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
python 实现屏幕录制示例
Dec 23 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
Python截图并保存的具体实例
Jan 14 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 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 Session变量不能传送到下一页的解决方法
2009/11/27 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
php读取本地json文件的实例
2018/03/07 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
jquery 使用简明教程
2014/03/05 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
Python 异常处理实例详解
2014/03/12 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
Python封装原理与实现方法详解
2018/08/28 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
财会自我鉴定范文
2013/12/27 职场文书
满月酒答谢词
2014/01/14 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
作风建设年度心得体会
2014/10/29 职场文书
实习单位指导教师评语
2014/12/30 职场文书
2015上半年个人工作总结
2015/07/27 职场文书