如何将 Jinja 与 Twisted 一起使用?

2024-05-03

我正在计划使用 Python 与 Twisted、Storm 和 Jinja 一起开发一个讨论软件。问题是 Jinja 不是为 Twisted 或异步套接字库而设计的,并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因。

那么,如何使用 Jinja 来渲染 Twisted 网页呢?


您可以使用 Jinja 渲染网页,就像在 Twisted 中使用任何其他 Python 库一样。你只需调用它即可。这对于 Twisted 来说可以很好地工作,尽管如果 Jinja 执行了某些阻塞操作,您可能会遇到性能问题。请注意,它是possible将阻塞库与 Twisted 一起使用就可以了,可以通过deferToThread或者如果不是性能问题,则只是阻止主循环。所以,我推断你的问题实际上是关于如何在不阻塞的情况下使用 Jinja。

Jinja 是一个模板库,这意味着它读取模板,调用模板上的一些视图逻辑,并写入一些 HTML 输出。所以有 3 件事可以阻止:

  1. 阅读模板,
  2. 写出结果。
  3. 运行视图逻辑(您的应用程序代码),

我不了解 Jinja,所以我不确切地知道这些东西的 API 是如何构造的,我无法告诉你该怎么做,但我的猜测是这部分很简单;因此,我将为您提供有关第 3 方模板库和 Twisted 的一般性答案。

因此,我将逐一解决这些问题,尽管顺序不完全:

1. 阅读模板

实际上,这里最合理的做法就是不在乎它。阅读模板可能真的很快。这些是经常访问的小文件,您的操作系统几乎肯定会将其保存在其文件系统缓存中。除非您正在做一些疯狂的事情,例如将它们放在 NFS 上,否则您不太可能会阻止读取它们。如果您分析您的应用程序并发现这是一个问题 - 因为,比方说,您的磁盘或远程文件系统非常慢 - 只需将模板读入cStringIO或者在启动时类似的东西,然后将其提供给 jinja。

3. 撰写回复

网页并不是那么大,并且 Twisted 不提供阻塞 API 来写入套接字。相反,它提供了一个 API,仅将整个结果缓冲在内存中,直到可以写出为止。我的建议是在这里做与阅读模板基本相同的事情:除非您有非常大的输出,否则在将响应提供给客户端时消耗一点 RAM 可能没问题。

2. 运行视图逻辑

这是您最有可能遇到问题的区域。 Jinja 可能无法处理以下结果Deferreds。但实际上,直接给你带来问题的并不是 Jinja:而是 Storm。当您访问某些属性时,Storm 期望能够阻止进行数据库查询。与数据库块交谈,这是大多数 Web 应用程序中阻塞 I/O 的最重要来源。所以你需要决定如何处理这个问题。您有几个选择:

  1. 只需在主线程中执行即可,不用担心。也许您的应用程序适用于 10 人的工作组,并且您的数据库位于本地。当然,您的 I/O 会阻塞,但如果它仍然满足性能要求,谁在乎呢?并非每个应用程序都必须扩展到月球并返回。
  2. 预取 Storm 中的所有内容deferToThread调用(或类似)并确保 Jinja 仅访问内存中的对象。这样您就可以在主线程中的回调中运行渲染器Deferred那是在进行数据库 I/O。如果您只访问内存中的对象,您的渲染器可能仍然需要一些时间,但这没关系。这个问题促使我在我的博客上发表一篇关于“阻塞”和“运行”之间区别的文章 http://glyph.twistedmatrix.com/2011/11/blocking-vs-running.html它作为草稿已经挂了很长一段时间了;你可能想去读一下。
  3. 在线程或子进程中进行整个渲染,并将其视为程序的阻塞组件。这失去了使用 Twisted 的一些好处,但集成阻塞 Jinja/Storm 组件和非阻塞纯 Twisted 组件(实际的聊天消息中继部分)仍然是一个完全可行的策略。

如果这些选项都不适合您,Twisted 包含一个模板库,does支持Deferreds http://twistedmatrix.com/documents/current/web/howto/twisted-templates.html从 11.0 版本开始。您可以考虑使用twisted.web.template作为 Jinja 的替代品。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Jinja 与 Twisted 一起使用? 的相关文章

随机推荐

  • 离子和电容器 - Android 启动画面响应能力

    Context 这与闪屏图像响应能力有关 根据我的研究 它之所以发生是因为缺少文档电容器文档 启动画面 https capacitorjs com docs apis splash screen Problem 当实现电容器的闪屏插件时 问
  • 在 JavaScript 中给变量字符串加上引号

    我有一个 JavaScript 变量 var text http example com 文本可以是多个链接 如何在变量字符串周围放置 例如 我希望字符串看起来像这样 http example com var text http examp
  • 遍历 globals() 字典

    我 尝试 使用globals 在我的程序中迭代所有全局变量 我就是这样做的 for k v in globals iteritems function k v 当然 这样做时 我只是创建了另外 2 个全局变量 k and v 所以我得到这个
  • 为 MoonAPNS 创建 p12 文件时卡住了

    我在创建 p12 证书时遇到一些问题 我之前创建了一个带有推送通知的应用程序 效果很好 应用程序获取用户设备 ID 并将其保存到数据库中 我已将代码添加到我的新应用程序中 并进行了与新应用程序一起使用的修改 从日志来看 它的工作方式似乎与我
  • 如何以编程方式使用 TestNG 运行 Selenium Java 测试?

    我使用 Selenium RC 和 Java 使用 TestNG 作为测试框架 我使用 Eclipse 作为 IDE 我想非常轻松地从我自己的程序中调用 TestNG 我怎样才能做到这一点 我的以下 Java 代码运行良好 Test pub
  • Angular 8 - 删除 ng-component 标签 - 表行模板

    我有一个灵活的表格组件 有两种模式 普通表 有效 自定义行模板 这不是因为角度添加
  • firebase函数链中间件

    有没有办法像 Express 一样在 普通 firebase 函数上链接中间件 ordinary 功能 addNote https onRequest req res next gt addNote req res next using e
  • 打包用来部署跨平台?

    在 Windows 上 应用程序通常打包为 MSI 在 Redhat Linux 上打包为 RPM 可用于将应用程序部署到所有平台 包括不同风格的 UNIX 和 Windows 的最佳开源打包方法是什么 内容包括 exe unix 二进制文
  • 多个指令 [myPopup、myDraggable] 请求新的/隔离的范围

    我编写了一个对话框指令 myPopup 和另一个用于拖动此对话框的指令 myDraggable 但我总是收到错误 多个指令 myPopup myDraggable 请求新的 隔离的范围 这是一个笨蛋 http plnkr co edit k
  • 从 Julia 中的文本文件读取数据矩阵

    我有一个包含矩阵的文本文件 我想在朱莉娅中将其作为矩阵来阅读 文本文件如下 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 在 matlab 中 您可以执行以下操作来创建矩阵M
  • Cloudfront函数总是返回503

    如何为 Cloudfront 上的静态托管网站的子目录设置默认根对象 https stackoverflow com questions 31017105 how do you set a default root object for s
  • 基于动态集合视图的 UITableView 的动态高度

    我必须添加一个UICollectionView里面一个UITableViewCell The collectionView可以有不同数量的项目 所以collectionView应在内部适当调整tableView 我已经在我的项目中实现了这个
  • 在 Android 应用程序中读取 CSV 文件

    我正在开发一个概念验证应用程序 以便我可以在我正在制作的更大的应用程序中实现该功能 我对 Java 和 Android 开发有点陌生 但希望这个问题不会太简单或太复杂 基本上 我试图从 CSV 文件中读取字符串列表 并使其可用于在应用程序的
  • jquery 工具提示在我的页面中添加 div role="log"

    我对 jquery tooltip 有一个奇怪的问题 我正在使用下面的代码
  • Kubernetes 1.8 支持的 Docker 版本

    我要将我的 Kubernetes 集群升级到该版本1 8 7 有谁知道哪个 docker 版本与其最兼容 这是我在 Kubernetes 官方页面上找到的 但我想它可能是针对最新的 k8s 版本的 1 9 在每台计算机上安装 Docker
  • 如何在中间人的部分内容中渲染部分内容

    我有一些 Haml 部分 其中许多包含样板 container row col lg 12 当我尝试将其抽象出来时 partial site section I get syntax error unexpected keyword end
  • Powershell 范围处理 v2/v3 的未记录更改?

    背景 我一直在编写一个 powershell 脚本 用于将文件从 Windows Server 08 使用 Powershell 2 x 上的 Sharpoint 2010 实例迁移到 Windows Server 12 使用 Powers
  • Android 设计导航抽屉 - 如何在 nav xml 中添加开关?

    我正在使用新的 Android 设计导航抽屉 我想在抽屉里加一个开关 有办法实现这个吗 这是菜单 xml menu menu
  • RecyclerView OnClick 位置

    我正在尝试获取我的点击项目的位置RecyclerView 然而 这有点奇怪 只让我在点击时记录位置 而不让我做一个Toast的位置 看这里 public class MainAdapter extends RecyclerView Adap
  • 如何将 Jinja 与 Twisted 一起使用?

    我正在计划使用 Python 与 Twisted Storm 和 Jinja 一起开发一个讨论软件 问题是 Jinja 不是为 Twisted 或异步套接字库而设计的 并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因