在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操作mysql中文显示乱码的解决方法
Oct 11 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
Django models filter筛选条件详解
Mar 16 Python
python推导式的使用方法实例
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-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
php和html的区别点详细总结
2019/09/24 PHP
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
Angular2库初探
2017/03/01 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
Python yield使用方法示例
2013/12/04 Python
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python argparser的具体使用
2019/11/10 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
python tqdm库的使用
2020/11/30 Python
python os.listdir()乱码解决方案
2021/01/31 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
好军嫂事迹材料
2014/01/15 职场文书
财务出纳岗位职责
2014/02/03 职场文书
开业庆典策划方案
2014/02/18 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
家长对学生的评语
2014/04/18 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
学校隐患排查制度
2015/08/05 职场文书
感恩教师节主题班会
2015/08/12 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python