在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实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
python linecache 处理固定格式文本数据的方法
Jan 08 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Django多数据库配置及逆向生成model教程
Mar 28 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
Python操作Excel的学习笔记
Feb 18 Python
用Python可视化新冠疫情数据
Jan 18 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
python中json格式数据输出的简单实现方法
2016/10/31 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
python单例模式实例解析
2018/08/28 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python 获取div标签中的文字实例
2018/12/20 Python
python实现海螺图片的方法示例
2019/05/12 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
应届生求职信写作技巧
2013/10/24 职场文书
高中生学习的自我评价
2013/12/14 职场文书
车队司机自我鉴定
2014/03/02 职场文书
餐厅总厨求职信
2014/03/04 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
施工安全汇报材料
2014/08/17 职场文书
综合办公室岗位职责
2015/04/11 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
用Python爬取某乎手机APP数据
2021/06/15 Python