在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 continue语句用法实例
Mar 11 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
Python3实现的判断环形链表算法示例
Mar 07 Python
Python中的asyncio代码详解
Jun 10 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
NumPy统计函数的实现方法
Jan 21 Python
解决python 找不到module的问题
Feb 12 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 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中$this和$that指针使用实例
2015/01/06 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
requireJS使用指南
2016/04/27 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
js代码实现轮播图
2020/05/04 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
Python定时执行之Timer用法示例
2015/05/27 Python
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
Python获取央视节目单的实现代码
2015/07/25 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
Python全排列操作实例分析
2018/07/24 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
html5时钟实现代码
2010/10/22 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
实习自我评价怎么写
2013/12/02 职场文书
公务员总结性个人自我评价
2013/12/05 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
大学生活自我评价
2014/04/09 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
创业女性典型材料
2014/05/02 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
初中教师个人总结
2015/02/10 职场文书
医院员工辞职信范文
2015/05/12 职场文书
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
Python+pyaudio实现音频控制示例详解
2022/07/23 Python