【问题标题】:Python templates for huge HTML/XML用于大型 HTML/XML 的 Python 模板
【发布时间】:2023-04-04 12:23:01
【问题描述】:

最近我需要生成一个巨大的 HTML 页面,其中包含一个包含数千行表格的报告。而且,显然,我不想在内存中构建整个 HTML(或底层树)。结果,我用旧的好字符串插值构建了页面,但我不喜欢这个解决方案。

因此,我想知道是否有 Python 模板引擎可以按部分生成页面内容。

UPD 1:我对列出所有可用的框架和模板引擎不感兴趣。 我对模板解决方案很感兴趣,我可以将其与任何框架分开使用,并且可以按部分生成内容,而不是在内存中构建整个结果。

我了解使用客户端脚本加载部分内容会提高可用性,但这超出了我当前问题的范围。比如说,我想生成一个巨大的 HTML/XML 并将其流式传输到本地文件中。

【问题讨论】:

  • 我用这个cheetahtemplate.org
  • @aaa:最近翻看Cheetah的文档,想了想,没有看到例子。 Mako 似乎也能够写入文件。
  • 你好。我对 makeo 了解不多,专门使用 cheetah 来生成大型 C++ 文件。 cheetah 的文档很详尽,但我不记得看过完整的示例。相反,我通过将文档中的每个 sn-p 应用于我的问题来学习它。
  • 我会使用一些经过验证的快速非验证模板引擎,并制作一个脚本来渲染每个片段并将其附加到文件中。

标签: python templates


【解决方案1】:

大多数流行的模板引擎都有一种方法可以生成渲染结果或将渲染结果写入带有块的文件对象。例如:

【讨论】:

  • 谢谢,这就是我要找的。​​span>
【解决方案2】:

使用例如通过 javascript 构建表格会更加用户友好(假设他们启用了 javascript)。一个 jQuery 插件,它允许在您向下滚动时自动加载内容。然后最初只加载几行,当用户向下滚动时,会按需加载更多行。

如果这不是解决方案,您可以使用三个模板:一个用于行之前的所有内容,一个用于行之后的所有内容,第三个用于行。 然后您首先发送 before-rows 模板,然后生成行并立即发送它们,然后是 after-rows 模板。那么你将在内存中只有一个块/行而不是整个表。

【讨论】:

  • 嗯,谢谢你的建议,但很遗憾,这并没有回答问题。
【解决方案3】:

在内存中构建这样的东西没有问题。几千行并不大。

对于您的模板需求,您可以使用以下任何一种:

sometools 允许从这些标记语言生成 HTML。

【讨论】:

  • 谢谢。我同意,在我的情况下 10000 并不是那么大(尽管取决于内容),但是如果我从 MySQL 获取数据,例如,大小可能会翻倍。无论如何,您的建议是以中间格式生成数据,然后使用列出的工具之一应用转换,不是吗?我注意到,有些解决方案甚至不是基于 Python 的。
  • 是的,像 RST 这样的东西可以比 HTML 更简洁地生成。然后只需调用第三方工具将其转换为 html。我相信我提供的所有示例都有一个 python 库。中间格式的另一个优点 - 是您可以轻松创建其他应用程序,例如:XML 表示,甚至将其公开为某种 API(但这是题外话)。
  • 关于将数据库查询的大小加倍 - 您可以轻松地在内存中保存超过 20k 条记录。如果您无法这样做 - 您可以将其写入文件(以中间或 csv 表示形式),然后将其转换为 html、xml 或其他任何内容。最慢的部分将是数据库查询(加上网络延迟,如果有的话),所以我不用担心文件的写入/读取+转换过程。我建议对大约 100 万行文件进行一些测试,方法是将它们从 RST 转换为 HTML,例如使用 Sphinx 之类的东西。
【解决方案4】:

您不需要流式模板引擎 - 我一直这样做,而且在您遇到任何模糊的服务器端之前,浏览器就会开始阻塞。在几乎任何浏览器中,渲染一个 10000 行的表都会占用 CPU 几秒钟;在 chrome 中滚动它会很麻烦,而且无论浏览器如何,浏览器内存的使用都会增加。

您可以做的是使用客户端 xslt(我之前已经实现过,尽管回想起来它并不是必需的)。使用字符串打印 xslt 处理指令和开始和结束标记既简单又相当安全;然后您可以使用您喜欢的任何 xml 编写器技术将每个单独的行作为独立的 xml 元素流式传输。

但是 - 你真的不需要这个,而且很可能永远不会 - 如果你的 html 生成器变得太慢,浏览器的问题将会增加一个数量级。

因此,除非您对此进行了基准测试并确定您确实有问题,否则不要浪费您的时间。如果您确实有问题,您可以在不从根本上改变方法的情况下解决它 - 在内存中生成可以正常工作。

【讨论】:

  • 这是一个很好的评论,因为这个问题对我来说更具理论性。实际上,我返回了一个大型 HTML 表,它恰好是一个有效的 XML,同时旨在轻松用于自动化。在我的情况下,我会使用一个写入文件的 XML 编写器,但 Python 的 std 库中没有。我没有从浏览器方面考虑问题。谢谢。
【解决方案5】:

您是否为此使用了 Web 框架? http://www.pylonshq.com 包括与多个模板引擎的兼容性。 http://www.djangoproject.com/Django 有自己的模板语言。

我认为包含使用 javascript 延迟加载行的答案适用于 Web 视图,但我认为需要打印报告,在这种情况下,您必须在某个时候构建整个内容对吧?

【讨论】:

  • 如果您阅读 pylons 网站,您可以了解几种独立于框架存在的模板语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2015-12-17
  • 2016-08-06
  • 1970-01-01
  • 2012-06-13
  • 2019-10-02
  • 2014-02-11
相关资源
最近更新 更多