在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 29 Python
Python迭代和迭代器详解
Nov 10 Python
Django验证码的生成与使用示例
May 20 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
python使用代理ip访问网站的实例
May 07 Python
如何利用python制作时间戳转换工具详解
Sep 12 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Django中信号signals的简单使用方法
Jul 04 Python
python基础 range的用法解析
Aug 23 Python
python如何把字符串类型list转换成list
Feb 18 Python
浅析Python迭代器的高级用法
Jul 16 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 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生成静态页面详解
2006/11/19 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php简单实现快速排序的方法
2015/04/04 PHP
php实现可运算的验证码
2015/11/10 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
Angular.js之作用域scope'@','=','&'实例详解
2017/02/28 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
优秀老员工获奖感言
2014/02/15 职场文书
护士求职自荐信范文
2014/03/19 职场文书
新品发布会策划方案
2014/06/08 职场文书
管理工程专业求职信
2014/08/10 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
南京南京观后感
2015/06/02 职场文书
担保书怎么写 ?
2019/04/22 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
解析MySQL binlog
2021/06/11 MySQL