Python 模板引擎是一种将动态数据嵌入静态模板的工具,通过特定语法实现逻辑与表现的分离。
format 格式化输出
相对于基本格式化输出采用“%”的方法,format的功能强大, 该函数把字符串当一个模板,通过传入的参数进行格式化, 并且使用大括号“{}”作为特殊字符代替“%”。
模板引擎(这里特指用于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等等)。
模板引擎
关于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