在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 14 Python
python之从文件读取数据到list的实例讲解
Apr 19 Python
python读取文本绘制动态速度曲线
Jun 21 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
python对视频画框标记后保存的方法
Dec 07 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
简单了解python代码优化小技巧
Jul 08 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 Python
PYTHON InceptionV3模型的复现详解
May 06 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
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
PHP时间类完整代码实例
2021/02/26 PHP
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
jquery对table做排序操作的实例演示
2017/08/10 jQuery
Web技术实现移动监测的介绍
2017/09/18 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
python处理csv数据的方法
2015/03/11 Python
python线程、进程和协程详解
2016/07/19 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
python实现自动发送邮件
2018/06/20 Python
python 自动批量打开网页的示例
2019/02/21 Python
20行python代码实现人脸识别
2019/05/05 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
Java程序员常见面试题
2015/07/16 面试题
大学生个人求职口试自我评价
2014/02/16 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
工作能力自我评价2015
2015/03/05 职场文书
党委工作总结2015
2015/04/27 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
python代码实现扫码关注公众号登录的实战
2021/11/01 Python