Python Web开发模板引擎优缺点总结

 更新时间:2014年05月06日 10:24:54   作者:  
这篇文章主要介绍了Python Web开发模板引擎优缺点总结,需要的朋友可以参考下

做 Web 开发少不了要与模板引擎打交道。我陆续也接触了 Python 的不少模板引擎,感觉可以总结一下了。

一、首先按照我的熟悉程度列一下:

pyTenjin:我在开发 Doodle 和 91 外教时使用。
Tornado.template:我在开发知乎日报时使用。
PyJade:我在开发知乎日报时接触过。
Mako:我只在一个早期就夭折了的小项目里用过。
Jinja2:我只拿它做过一些 demo。

其他就不提了,例如 Django 的模板,据说又慢又难用,我根本就没接触过。

二、再说性能

很多测试就是弄个大循环什么的,很没技术含量。其实模板的渲染时间主要消耗在字符串处理上,包括拼接、编码、转义等,而循环测的则是 Python runtime 的性能。

所以我还是用实际的例子来测试吧,最终选择了 Doodle 的首页。它有几个子模板、几个循环、几个函数调用和很多个变量,具有一定代表性。考虑到 pyTenjin 以外的模板引擎不支持局部缓存,我就把用到缓存的侧边栏去掉了,只渲染主体部分。

渲染 1000 次的结果为:pyTenjin 耗时 0.65 秒,取消预处理后耗时 0.9 秒;Tornado.template 耗时 1.0 秒;Jinja2 耗时 1.1 秒。

测试代码有几百行,19 个文件,我就懒得列出来了。其他模板引擎也懒得测了。

@pyTenjin 的优势很明显,特别是它支持预处理。这个预处理的主要作用是把一些常量先编译好,渲染时就不用再处理了(因为已经变成字符串了);此外,有些功能可以静态地决定是否开启,而预处理可以把那些不需要的功能代码(主要是 if 分支)提前去掉。此外还能缓存任意代码段的渲染结果,在一段时间内无需重新渲染。
@Jinja2 比 Tornado.template 慢是我没想到的,好像与很多测试不符。
@Mako 预计和 Jinja2 差不多。它也能缓存代码段的渲染结果。
@PyJade 需要把 Jade 模板转成其他模板,且无缓存,预计会慢很多。

考虑到除 PyJade 外肯定不存在几倍的性能差距,所以挑个好用的即可。

三、最后说易用性

@pyTenjin 的优点是可以写任意 Python 代码。
缺点是标记比较复杂和独特,有 <?py ... ?>、<?PY ... ?>、#{...}、#{{...}}、{==...==}、{#==...==#}、${...}、${{...}}、{#=...=#} 和 {#==...==#} 这么多种,不过看上去还挺萌的。
由于使用了 < 和 > 符号,在 HTML 标签内部使用时,会阻碍编辑器进行语法解析。
另外,它的 tagattr() 方法在 expr 参数为 0 时当成了 True 来处理,需要改源码来修正,而它又没有开源项目可以提交 pull request。
而且它只有一个开发者,已经有一年多没更新了,活跃度明显不够。

@Tornado.template 的优点是与 Tornado 搭配还不错(毕竟是自带的),功能和性能都还行。
缺点是出错时很难定位到是哪写错了,而且与其他模板引擎相比,功能确实少了点(不过我还没遇到不够用的情况)。
另外,{% raw ... %} 写起来好麻烦。None 在输出时会显示成 None,而不是空字符串,导致写起来很累。
它输出的 HTML 代码是去掉头尾空格的,不过单独的 Python 代码行会显示成空行,看上去比较怪。

@Jinja2 的优点是功能多,定义了很多辅助函数,有 filter,也有内联的 if 表达式这种语法糖,写起来比较舒服。此外,它能够调整空白,这使得它输出的 HTML 比较好看。
缺点是学习成本较高,语法也不是纯 Python 了,甚至不能 import Python 模块和使用 [item for item in list if item] 这种列表解析表达式。
另一个严重的缺点是不能输出非 ASCII 的字符串, 遇到这种情况必须使用 unicode 类型,但要保证这点很麻烦。

@Mako 的优点是和 pyTenjin 一样可以写任意 Python 代码,又和 Jinja2 一样支持 filter(其实习惯了函数调用的话)。
缺点也是学习成本较高,语法比较复杂,对 HTML 编辑器不友好。

@PyJade 的优点是写起来最快(特别是对前端而言),没什么多余的东西。
缺点和 Jinja2 一样,更惨的是它几乎没有文档,而且最新的 release 版不可用,需要用开发版。

目前看来,我还是继续用 pyTenjin 算了,其他的要么不好用,要么学习成本比较高,而且多出来的功能感觉并不是非有不可的。

相关文章

  • python向图片里添加文字

    python向图片里添加文字

    这篇文章主要为大家详细介绍了python向图片里添加文字,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Pytorch使用shuffle打乱数据的操作

    Pytorch使用shuffle打乱数据的操作

    这篇文章主要介绍了Pytorch使用shuffle打乱数据的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python中使用smtplib和email模块发送邮件实例

    python中使用smtplib和email模块发送邮件实例

    python脚本发邮件,一般会用到smtplib和email这两个模块。看看该模块怎么使用,先看smtplib模块。 smtplib模块定义了一个简单的SMTP客户端,可以用来在互联网上发送邮件
    2014-04-04
  • 5分钟快速掌握Python定时任务框架的实现

    5分钟快速掌握Python定时任务框架的实现

    这篇文章主要介绍了5分钟快速掌握 Python 定时任务框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python实现在线音乐播放器

    Python实现在线音乐播放器

    这篇文章主要为大家详细介绍了Python实现在线音乐播放器的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 基于DATAFRAME中元素的读取与修改方法

    基于DATAFRAME中元素的读取与修改方法

    今天小编就为大家分享一篇基于DATAFRAME中元素的读取与修改方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • pycharm远程连接服务器运行pytorch的过程详解

    pycharm远程连接服务器运行pytorch的过程详解

    这篇文章主要介绍了在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorch的过程,包括安装PyTorch、CUDA以及配置PyCharm远程开发环境的详细步骤,需要的朋友可以参考下
    2025-02-02
  • Django中数据库迁移常用的命令小结

    Django中数据库迁移常用的命令小结

    在Django中数据库迁移用于保持数据库结构与模型定义同步,这篇文章主要介绍了Django中数据库迁移常用的命令,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • python并发和异步编程实例

    python并发和异步编程实例

    这篇文章主要为大家详细介绍了python并发和异步编程实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • python可视化text()函数使用详解

    python可视化text()函数使用详解

    这篇文章主要介绍了python可视化text()函数使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论