你应该(或许)没使用过的 3 种 Python 模板语言
当需要使用模板语言来编写 Python Web 应用时,应该用过语有很多健壮的或许解决方案。
有 Jinja2、没使模板Genshi 和 Mako。应该用过语甚至还有 Chameleon 之类的或许解决方案,虽然有些陈旧,没使模板但仍被 Pyramid 框架推荐。应该用过语
Python 已经存在了很长时间。或许此时,没使模板在系统的应该用过语深处,它积累了一些几乎被遗忘的或许模板语言,它们都是没使模板值得一试的。
这些语言就像桉树上可爱的应该用过语考拉一样,在自己的或许生态圈里快乐地生活着,有时也会有危险的没使模板工作,这些都是很少有人听说过的模板语言,使用过的应该更少。

3. string.Template
你是否曾经想过:“如何获得一种没有任何特性的模板语言,而且同时也不需要 pip install 安装任何东西?” Python 标准库已经为你提供了答案。虽然没有循环和条件,企商汇但 string.Template 类是一种最小的模板语言。
使用它很简单。
>>> import string >>> greeting = string.Template("Hello, $name, good $time!") >>> greeting.substitute(name="OpenSource.com", time="afternoon") Hello, OpenSource.com, good afternoon!2. twisted.web.template
你会给一个包罗万象的库送什么礼物?
当然,不是模板语言,因为它已经有了。twisted.web.template 中嵌套了两种模板语言。一种是基于 XML 的,并有一个很棒的文档。
但是它还有另一种,一种基于使用 Python 作为领域特定语言(DSL)来生成 HTML 文档。
它基于两个原语:包含标签对象的 twisted.web.template.tags 和渲染它们的 twisted.web.template.flattenString。由于它是 Twisted 的一部分,因此它内置支持高效异步渲染。
此例将渲染一个小页面:
async def render(reactor): my_title = "A Fun page" things = ["one", "two", "red", "blue"] template = tags.html( tags.head( tags.title(my_title), ), tags.body( tags.h1(my_title), tags.ul( [tags.li(thing) for thing in things], ), tags.p( task.deferLater(reactor, 3, lambda: "Hello "), task.deferLater(reactor, 3, lambda: "world!"), ) ) ) res = await flattenString(None, template) resres = res.decode(utf-8) with open("hello.html", w) as fpout: fpout.write(res)该模板是使用 tags. 来指示层次结构的常规 Python 代码。原生支持渲染字符串,因此任何字符串都正常。
要渲染它,你需要做的是b2b供应网添加调用:
from twisted.internet import task, defer from twisted.web.template import tags, flattenString def main(reactor): return defer.ensureDeferred(render(reactor))最后写上:
task.react(main)只需 3 秒(而不是 6 秒),它将渲染一个不错的 HTML 页面。在实际中,这些 deferLater 可以是对 HTTP API 的调用:它们将并行发送和处理,而无需付出任何努力。我建议你阅读关于更好地使用 Twisted。不过,这已经可以工作了。
1. Quixote
你会说:“但是 Python 并不是针对 HTML 领域而优化的领域特定语言。” 如果有一种语言可以转化到 Python,但是更适合定义模板,而不是像 Python 那样按原样解决呢?如果可以的话,请使用“Python 模板语言”(PTL)。
编写自己的语言,有时被说成是一个攻击假想敌人的唐吉坷德项目。当 Quixote(可在 PyPI 中找到)的创造者决定这样做时,并没有受此影响。
以下将渲染与上面 Twisted 相同的模板。云南idc服务商警告:以下不是有效的 Python 代码:
import time def render [html] (): my_title = "A Fun page" things = ["one", "two", "red", "blue"] "<html><head><title>" my_title "</head></title><body><h1>" my_title "</h1>" "<ul>" for thing in things: "<li>" thing "</li>" "<p>" time.sleep(3) (lambda: "Hello ")() time.sleep(3) (lambda: "world!")() "</p>" "</body></html>" def write(): result = render() with open("hello.html", w) as fpout: fpout.write(str(result))但是,如果将它放到 template.ptl 文件中,那么可以将其导入到 Quixote 中,并写出可以渲染模板的版本:
>>> from quixote import enable_ptl >>> enable_ptl() >>> import template >>> template.write()Quixote 安装了一个导入钩子,它会将 PTL 文件转换为 Python。请注意,此渲染需要 6 秒,而不是 3 秒。你不再获得自由的异步性。
Python 中的模板太多
Python 库的历史悠久且曲折,其中一些库可以或多或少都能达到类似结果(例如,Python 包管理)。
我希望你喜欢探索这三种可以用 Python 创建模板的方式。另外,我建议从这三个库之一开始了解。
相关文章
电脑照相机显示代码错误原因及解决方法(解析电脑照相机显示代码错误的几种情况和解决方案)
摘要:随着科技的不断进步,电脑照相机已经成为我们日常生活中常用的工具之一。然而,有时我们会遇到电脑照相机显示代码错误的问题,这给我们的使用带来了一定的困扰。本文将以电脑照相机显示代码错误...2025-11-05如何使用驱动精灵驱动摄像头(简单操作、快速安装的摄像头驱动工具)
摘要:随着科技的进步和智能设备的普及,摄像头在我们的生活中扮演着越来越重要的角色。然而,有时我们可能会遇到无法识别摄像头或者无法正常工作的情况。为了解决这个问题,本文将介绍如何使用驱动精...2025-11-05日版苹果6的性能与功能介绍(以日版苹果6为例,探讨其性能表现及功能优势)
摘要:在智能手机市场中,苹果一直以来都是一股强大的力量。作为其中的一款经典机型,日版苹果6不仅延续了苹果品牌一贯的高质量和卓越性能,更凭借其独特的设计和出色的功能而备受关注。本文将以日版...2025-11-05- 摘要:随着科技的不断发展,电子支付成为了现代生活中不可或缺的一部分。万达支付作为一种便捷的电子支付方式,受到了越来越多人的青睐。本文将介绍万达支付的特点和优势,并探讨其在日常生活中的应用...2025-11-05
锤子M1L(探索锤子M1L的游戏性能与亮点,带你领略全新游戏世界)
摘要:在现代社会,手机早已成为了人们生活中不可或缺的一部分。而对于游戏爱好者来说,一个能够提供高质量游戏体验的手机尤为重要。本文将以锤子M1L打游戏的表现为主题,详细介绍其在游戏性能方面...2025-11-05- 摘要:在当今数字化时代,音乐已经成为人们生活中不可或缺的一部分。而在这个充满竞争的音乐市场中,有一款名为beatsep的应用程序引起了广泛关注。它到底有何独特之处呢?本文将深入探索bea...2025-11-05

最新评论