>>> from  env_helper import info; info()
页面更新时间: 2024-04-07 23:44:06
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

6.2. Python模板引擎

6.2.1. format格式化输出

相对于基本格式化输出采用“%”的方法,format的功能强大,该函数把字符串当一个模板,通过传入的参数进行格式化,并且使用大括号“{}”作为特殊字符代替“%”

6.2.2. 模板引擎

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。

通俗地说,模板引擎就是你需要根据不同数据,重复生成结构相同的html的时候,模板可以大大节省你的代码量,以及提高可维护性。

优点:

  • 节省代码量。

  • 减少拼接HTML的麻烦。

  • 可维护性好,后期修改起来比较方便。

  • 效率高(程序逻辑组织更好,调试方便)。

  • 容易编写(不容易写错)。

  • 前后端分离。

浏览器端的模板引擎

最早的前端模板引擎是 jCT,它托管于 Google Code,诞生于 2008 年,宿主语言是 JavaScript,工作在浏览器中。 目前流行的java web的jsp、freemark、thymeleaf,nodejs的jade和ejs等, js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTemplate,doT,tmpl, handlebars, easyTemplate, underscoretemplate ,mustache ,kissytemplate等等)。

6.2.3. python的模板引擎

关于python的技术,几乎每时每刻都在更新换代,目前主流的python模板引擎主要有以下四个。

Mako

Mako 是以 MIT 许可证发布的 Python 模板工具,专为快速展现而设计的(与 Jinja2 不同)。Reddit 已经使用 Mako 来展现他们的网页,它同时也是 Pyramid 和 Pylons 等 web 框架的默认模板语言。它相当简单且易于使用。你可以使用几行代码来设计模板;支持 Python 2.x 和 3.x,它是一个功能强大且功能丰富的工具,具有良好的文档,这一点我认为是必须的。其功能包括过滤器、继承、可调用块和内置缓存系统,这些系统可以被大型或复杂的 web 项目导入。

Mako使用非常简单,并且速度快,由于模板最终被编译成Python字节码,因此Mako的方法非常高效

Jinja2

Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。 他基于unicode并能在python2.4之后的版本运行,包括python3。

特性

  • 沙箱执行模式,模板的每个部分都在引擎的监督之下执行,模板将会被明确地标记在白名单或黑名单内,这样对于那些不信任的模板也可以执行。

  • 强大的自动HTML转义系统,可以有效地阻止跨站脚本攻击。

  • 模板继承机制,此机制可以使得所有的模板都具有相似一致的布局,也方便了开发人员对模板的修改和管理。

  • 高效的执行效率,Jinja2引擎在模板第一次加载时就把源码转换成Python字节码,加快模板执行时间。

  • 可选的预编译模式。

  • 调试系统融合了标准的Python的TrackBack系统,使得模板编译和运行期间的错误能及时被发现和调试。

  • 语法可配置,可以重新配置Jinja2使得它更好地适应LaTeX或JavaScript的输出。

Genshi

Genshi 是我会提到的第三个选择。它是一个 XML 工具,具有强大的模板组件,所以如果你使用的数据已经是 XML 格式,或者你需要使用网页以外的格式,Genshi 可能成为你的一个很好的解决方案。HTML 基本上是一种 XML(好吧,不是精确的,但这超出了本文的范围,有点卖弄学问了),因此格式化它们非常相似。由于我通常使用的很多数据都是 XML 或其他类型的数据,因此我非常喜欢使用我可以用于多种事物的工具。

发行版目前仅支持 Python 2.x,尽管 Python 3 支持存在于主干中,但我提醒你,它看起来并没有得到有效的开发。Genshi 遵循 BSD 许可证提供。

优点:

  • 智能自动转义大大降低了您的网站对外开放的风险跨站点脚本攻击(XSS)。

  • 模板指令通常不如大多数其他模板语言中的指令那么冗长,因为它们可以直接附加到它们所作用的元素上。

  • 与特定的序列化格式无关,您可以立即在生成格式良好的HTML 4.01和XHTML 1.0(或其他格式)之间进行切换。

  • 基于流的筛选使您可以在处理模板时应用各种转换,而不必再次解析和序列化输出。

  • 匹配模板让你强制执行模板输出一个共同的结构,和更多。它与XInclude支持结合使用,而不是其他模板语言中常见的更严格的继承功能。

Tornado模板引擎

Tornado 是一个基于Python的Web服务框架和 异步网络库, 最早开发与 FriendFeed 公司. 通过利用非阻塞网络 I/O, Tornado 可以承载成千上万的活动连接, 完美的实现了 长连接, WebSockets, 和其它对于每一位用户来说需要长连接的程序.

Tornado是基于Bret Taylor和其他人员为FrientFeed所开发的网络服务框架,当FriendFeed被Facebook收购后得以开源。不同于那些最多只能达到1w并发连接的传统网络服务器。Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使其成为一个拥有高性能的框架。

Tornado的Web框架和HTTP服务器一起提供了完整的堆栈替代方案WSGI

选择建议:

  • 前提,选择的引擎能满足数据渲染需求,且不和现有依赖冲突,如果你已经非常熟悉某个引擎,那你已经有答案了。

  • 看项目需求,如果只是一次的话直接选择轻量的,学习复杂度最低的。

  • 是否要做组件开发

  • 引擎支持预编译结果,是否每次都需要实时编译

  • 要跨平台么? 有官方提供支持的,首选类 React-JSX 的引擎或纯粹的 VDOM 引擎。

  • 选择学习或维护复杂度最低的

  • 最后才是性能对比,性能对比是一件非常细致的工作,他人的对比结果不一定符合你的场景。

  • 不要只看速度,对于速度,不得不提模板“编译速度”和“渲染速度”。主流模板都支持将模板预编译,然后再渲染。