在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多进程并发(multiprocessing)用法实例详解
Jun 02 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
火车票抢票python代码公开揭秘!
Mar 08 Python
python查询mysql,返回json的实例
Mar 26 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
python实现二维数组的对角线遍历
Mar 02 Python
python线程安全及多进程多线程实现方法详解
Sep 27 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
Python中的整除和取模实例
Jun 03 Python
Matplotlib中rcParams使用方法
Jan 05 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
Python中的datetime包与time包包和模块详情
Feb 28 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 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
php 实现进制相互转换
2016/04/07 PHP
PHP框架性能测试报告
2016/05/08 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
NodeJs项目中关闭ESLint的方法
2018/08/09 NodeJs
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
django反向解析和正向解析的方式
2018/06/05 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
基于Python绘制个人足迹地图
2020/06/01 Python
python爬虫可以爬什么
2020/06/16 Python
python 实现图片批量压缩的示例
2020/12/18 Python
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
运动会表扬稿大全
2014/01/16 职场文书
中专生毕业个人鉴定
2014/02/26 职场文书
安全负责人任命书
2014/06/06 职场文书
工地安全标语
2014/06/07 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
Vue router配置与使用分析讲解
2022/12/24 Vue.js