你应该(或许)没使用过的 3 种 Python 模板语言

开发 后端
当需要使用模板语言来编写 Python Web 应用时,有很多健壮的解决方案。有 Jinja2、Genshi 和 Mako。甚至还有 Chameleon 之类的解决方案,虽然有些陈旧,但仍被 Pyramid 框架推荐。

当需要使用模板语言来编写 Python Web 应用时,有很多健壮的解决方案。

有 Jinja2、Genshi 和 Mako。甚至还有 Chameleon 之类的解决方案,虽然有些陈旧,但仍被 Pyramid 框架推荐。

Python 已经存在了很长时间。此时,在系统的深处,它积累了一些几乎被遗忘的模板语言,它们都是值得一试的。

这些语言就像桉树上可爱的考拉一样,在自己的生态圈里快乐地生活着,有时也会有危险的工作,这些都是很少有人听说过的模板语言,使用过的应该更少。

3. string.Template

你是否曾经想过:“如何获得一种没有任何特性的模板语言,而且同时也不需要 pip install 安装任何东西?” Python 标准库已经为你提供了答案。虽然没有循环和条件,但 string.Template 类是一种最小的模板语言。

使用它很简单。

  1. >>> import string 
  2. >>> greeting = string.Template("Hello, $name, good $time!") 
  3. >>> greeting.substitute(name="OpenSource.com"time="afternoon"
  4. '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 的一部分,因此它内置支持高效异步渲染。

此例将渲染一个小页面:

  1. async def render(reactor): 
  2.     my_title = "A Fun page" 
  3.     things = ["one", "two", "red", "blue"] 
  4.     template = tags.html( 
  5.             tags.head( 
  6.                 tags.title(my_title), 
  7.             ), 
  8.             tags.body( 
  9.                 tags.h1(my_title), 
  10.                 tags.ul( 
  11.                     [tags.li(thing) for thing in things], 
  12.                 ), 
  13.                 tags.p( 
  14.                     task.deferLater(reactor, 3, lambda: "Hello "), 
  15.                     task.deferLater(reactor, 3, lambda: "world!"), 
  16.                 ) 
  17.             ) 
  18.     ) 
  19.     res = await flattenString(None, template) 
  20.     resres = res.decode('utf-8') 
  21.     with open("hello.html", 'w') as fpout: 
  22.         fpout.write(res) 

该模板是使用 tags. 来指示层次结构的常规 Python 代码。原生支持渲染字符串,因此任何字符串都正常。

要渲染它,你需要做的是添加调用:

  1. from twisted.internet import task, defer 
  2. from twisted.web.template import tags, flattenString 
  3. def main(reactor): 
  4.     return defer.ensureDeferred(render(reactor)) 

最后写上:

  1. task.react(main) 

只需 3 秒(而不是 6 秒),它将渲染一个不错的 HTML 页面。在实际中,这些 deferLater 可以是对 HTTP API 的调用:它们将并行发送和处理,而无需付出任何努力。我建议你阅读关于更好地使用 Twisted。不过,这已经可以工作了。

1. Quixote

你会说:“但是 Python 并不是针对 HTML 领域而优化的领域特定语言。” 如果有一种语言可以转化到 Python,但是更适合定义模板,而不是像 Python 那样按原样解决呢?如果可以的话,请使用“Python 模板语言”(PTL)。

编写自己的语言,有时被说成是一个攻击假想敌人的唐吉坷德项目。当 Quixote(可在 PyPI 中找到)的创造者决定这样做时,并没有受此影响。

以下将渲染与上面 Twisted 相同的模板。警告:以下不是有效的 Python 代码:

  1. import time 
  2. def render [html] (): 
  3.     my_title = "A Fun page" 
  4.     things = ["one", "two", "red", "blue"] 
  5.     "<html><head><title>
  6.     my_title 
  7.     "</head></title><body><h1>
  8.     my_title 
  9.     "</h1>
  10.     "<ul>
  11.     for thing in things: 
  12.         "<li>
  13.         thing 
  14.         "</li>
  15.     "<p>
  16.     time.sleep(3) 
  17.     (lambda: "Hello ")() 
  18.     time.sleep(3) 
  19.     (lambda: "world!")() 
  20.     "</p>
  21.     "</body></html>
  22. def write(): 
  23.     result = render() 
  24.     with open("hello.html", 'w') as fpout: 
  25.         fpout.write(str(result)) 

但是,如果将它放到 template.ptl 文件中,那么可以将其导入到 Quixote 中,并写出可以渲染模板的版本:

  1. >>> from quixote import enable_ptl 
  2. >>> enable_ptl() 
  3. >>> import template 
  4. >>> template.write() 

Quixote 安装了一个导入钩子,它会将 PTL 文件转换为 Python。请注意,此渲染需要 6 秒,而不是 3 秒。你不再获得自由的异步性。

Python 中的模板太多

Python 库的历史悠久且曲折,其中一些库可以或多或少都能达到类似结果(例如,Python 包管理)。

我希望你喜欢探索这三种可以用 Python 创建模板的方式。另外,我建议从这三个库之一开始了解。

 

责任编辑:赵宁宁 来源: Linux中国
相关推荐

2020-05-26 12:32:30

Python模板语言编程语言

2021-06-04 08:48:31

Dockerrunlikewhaler

2021-04-09 20:38:20

Vue模式.前端

2020-01-12 19:48:13

编程语言RustPython

2019-07-22 13:39:59

Python编辑器开发

2021-01-28 23:40:58

编程语言PythonPerl

2021-01-29 12:28:13

编程语言开发代码

2018-06-06 09:10:34

编程语言Python库

2024-10-30 16:39:45

2013-05-20 10:14:42

软件工具项目工具开发工具

2022-02-14 22:04:50

浏览器Observer监听

2019-04-24 08:34:46

编程语言PythonJava

2015-08-03 10:25:58

C语言特性不为人知

2022-07-07 08:00:51

Java内存模型

2020-11-18 08:15:39

TypeScript设计模式

2014-12-17 09:27:41

开源PaaS

2022-08-18 09:51:50

Python代码循环

2022-03-28 20:57:31

私有属性class属性和方法

2021-12-15 23:10:34

JS Debugger 前端开发

2021-06-07 12:40:34

Python代码陷阱
点赞
收藏

51CTO技术栈公众号