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 Web开发模板引擎优缺点总结
-
使用TinyButStrong模板引擎来做WEB开发
-
Spring Boot Web开发与thymeleaf模板引擎
-
基于hi-nginx的web开发(python篇)——使用jinja2模板引擎
-
asp模板引擎终结者(WEB开发之ASP模式)
-
[SpringBoot——Web开发(使用Thymeleaf模板引擎)]
-
体悟与总结之虫师作品《Web接口开发与自动化测试...Python..》问题处理(持续更新。。。)
-
python web开发笔记--MAC上Django+uwsgi构建总结
-
Python Web开发模板引擎优缺点总结
-
strong world 使用TinyButStrong模板引擎来做WEB开发