欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-11 19:44:34
做 web 开发少不了要与模板引擎打交道。我陆续也接触了 python 的不少模板引擎,感觉可以总结一下了。 一、首先按照我的熟悉程度列一下:pytenjin:我在开发...

做 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 算了,其他的要么不好用,要么学习成本比较高,而且多出来的功能感觉并不是非有不可的。