在Python的Django框架中编写编译函数


Posted in Python onJuly 20, 2015

当遇到一个模板标签(template tag)时,模板解析器就会把标签包含的内容,以及模板解析器自己作为参数调用一个python函数。 这个函数负责返回一个和当前模板标签内容相对应的节点(Node)的实例。

例如,写一个显示当前日期的模板标签:{% current_time %}。该标签会根据参数指定的 strftime 格式(参见:http://www.djangoproject.com/r/python/strftime/)显示当前时间。首先确定标签的语法是个好主意。 在这个例子里,标签应该这样使用:

<p>The time is {% current_time "%Y-%m-%d %I:%M %p" %}.</p>

注意

没错, 这个模板标签是多余的,Django默认的 {% now %} 用更简单的语法完成了同样的工作。 这个模板标签在这里只是作为一个例子。

这个函数的分析器会获取参数并创建一个 Node 对象:

from django import template

register = template.Library()

def do_current_time(parser, token):
  try:
    # split_contents() knows not to split quoted strings.
    tag_name, format_string = token.split_contents()
  except ValueError:
    msg = '%r tag requires a single argument' % token.split_contents()[0]
    raise template.TemplateSyntaxError(msg)
  return CurrentTimeNode(format_string[1:-1])

这里需要说明的地方很多:

    每个标签编译函数有两个参数,parser和token。parser是模板解析器对象。 我们在这个例子中并不使用它。 token是正在被解析的语句。

    token.contents 是包含有标签原始内容的字符串。 在我们的例子中,它是 'current_time "%Y-%m-%d %I:%M %p"' 。

    token.split_contents() 方法按空格拆分参数同时保证引号中的字符串不拆分。 应该避免使用 token.contents.split() (仅使用Python的标准字符串拆分)。 它不够健壮,因为它只是简单的按照所有空格进行拆分,包括那些引号引起来的字符串中的空格。

    这个函数可以抛出 django.template.TemplateSyntaxError ,这个异常提供所有语法错误的有用信息。

    不要把标签名称硬编码在你的错误信息中,因为这样会把标签名称和你的函数耦合在一起。 token.split_contents()[0]总是记录标签的名字,就算标签没有任何参数。

    这个函数返回一个 CurrentTimeNode (稍后我们将创建它),它包含了节点需要知道的关于这个标签的全部信息。 在这个例子中,它只是传递了参数 "%Y-%m-%d %I:%M %p" 。模板标签开头和结尾的引号使用 format_string[1:-1] 除去。

    模板标签编译函数 必须 返回一个 Node 子类,返回其它值都是错的。

Python 相关文章推荐
Python使用random和tertools模块解一些经典概率问题
Jan 28 Python
python使用htmllib分析网页内容的方法
May 08 Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 Python
python3实现暴力穷举博客园密码
Jun 19 Python
神经网络理论基础及Python实现详解
Dec 15 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
python的继承知识点总结
Dec 10 Python
python3.7 的新特性详解
Jul 25 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 Python
Python的Django框架中自定义模版标签的示例
Jul 20 #Python
详解在Python的Django框架中创建模板库的方法
Jul 20 #Python
简单介绍Python的Django框架加载模版的方式
Jul 20 #Python
在Django框架中编写Context处理器的方法
Jul 20 #Python
详解Django框架中用context来解析模板的方法
Jul 20 #Python
Django中URLconf和include()的协同工作方法
Jul 20 #Python
在Python的Django框架中包装视图函数
Jul 20 #Python
You might like
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
Vuex简单入门
2017/04/19 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
python字符串连接方式汇总
2014/08/21 Python
Python中unittest用法实例
2014/09/25 Python
python中随机函数random用法实例
2015/04/30 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Python实现多属性排序的方法
2018/12/05 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
pandas数据集的端到端处理
2019/02/18 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
laravel使用redis队列实例讲解
2021/03/23 PHP
乡镇网格化管理实施方案
2014/03/23 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
2019消防宣传标语!
2019/07/10 职场文书