在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内置函数之filter map reduce介绍
Nov 30 Python
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
在Python中操作字典之setdefault()方法的使用
May 21 Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 Python
基于Django用户认证系统详解
Feb 21 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
Python基于scipy实现信号滤波功能
May 08 Python
Python 线程池用法简单示例
Oct 02 Python
keras中的History对象用法
Jun 19 Python
python中的错误如何查看
Jul 08 Python
python rsa-oaep加密的示例代码
Sep 23 Python
如何利用pycharm进行代码更新比较
Nov 04 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制作新闻系统的思路
2006/10/09 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
javascript中的对象创建 实例附注释
2011/02/08 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
jquery foreach使用示例
2013/09/12 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
原生Js实现简易烟花爆炸效果的方法
2015/03/20 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
Python的Django框架使用入门指引
2015/04/15 Python
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
python实现flappy bird小游戏
2018/12/24 Python
Python实现ATM系统
2020/02/17 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
动物学专业毕业生求职信
2013/10/11 职场文书
求职自荐信
2013/12/14 职场文书
银行求职信个人范文
2013/12/16 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
小学生新学期寄语
2014/01/19 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
年终奖发放方案
2014/06/02 职场文书
奖学金个人总结
2015/03/04 职场文书
初婚初育证明范本
2015/06/18 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers