在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实现挑选出来100以内的质数
Mar 24 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
python 实现删除文件或文件夹实例详解
Dec 04 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
python中使用正则表达式的连接符示例代码
Oct 10 Python
Python实现简易Web爬虫详解
Jan 03 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
记一次django内存异常排查及解决方法
Aug 07 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
Python实现手势识别
2020/10/21 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
化学教学随笔感言
2014/02/19 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
班级标语大全
2014/06/21 职场文书
宣传活动总结范文
2014/07/01 职场文书
环保志愿者活动方案
2014/08/14 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
兴趣班停课通知
2015/04/24 职场文书
幼儿园心得体会范文
2016/01/21 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android