在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 28 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
python使用super()出现错误解决办法
Aug 14 Python
python实现学生管理系统
Jan 11 Python
Python操作mongodb的9个步骤
Jun 04 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
python随机模块random使用方法详解
Feb 14 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
用python对oracle进行简单性能测试
Dec 05 Python
python中温度单位转换的实例方法
Dec 27 Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 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 for 循环语句使用方法详细说明
2010/05/09 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
JSON.stringify()方法讲解
2019/01/31 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
《和田的维吾尔》教学反思
2014/04/14 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
业务员管理制度范本
2015/08/06 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server