在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 29 Python
深入浅析Python字符编码
Nov 12 Python
深入理解Python对Json的解析
Feb 14 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
Django中提示消息messages的设置方式
Nov 15 Python
python实现从wind导入数据
Dec 03 Python
Python如何在DataFrame增加数值
Feb 14 Python
Python实现壁纸下载与轮换
Oct 19 Python
Python编写万花尺图案实例
Jan 03 Python
Python中生成ndarray实例讲解
Feb 22 Python
对PyTorch中inplace字段的全面理解
May 22 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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
我的论坛源代码(九)
2006/10/09 PHP
php将数据库导出成excel的方法
2010/05/07 PHP
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
PHP5.3新特性小结
2016/02/14 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
python else语句在循环中的运用详解
2020/07/06 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
应用艺术专业个人的自我评价
2014/01/03 职场文书
学校师德承诺书
2014/05/23 职场文书
天地会口号
2014/06/17 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
vue实现简易音乐播放器
2022/08/14 Vue.js