【问题标题】:Python web service with Twisted带有 Twisted 的 Python Web 服务
【发布时间】:2011-07-11 11:04:51
【问题描述】:

这与我之前的问题Python web service有关。

我将使用 Tornado 在服务器和客户端之间交换信息。将有一台服务器和 N 个客户端。客户端将定期(每 2 分钟左右)发送信息(磁盘使用情况、进程等)。客户端的数据将由自定义类/列表表示。在另一端(服务器)拥有相同的数据会很好。

我有使用 SOAP 的经验,这可能没问题(在服务器上有足够的位超时),但宁愿使用更轻量级和 pythonic 的东西。通信将或多或少只有客户端 -> 服务器。

服务器端和客户端都是用 Python 编写的。

我应该在 Twisted 文档中寻找什么来做这种事情?

编辑:我不是在问如何序列化数据(JSON 或 pickle 或 XML 等)。我想知道 Twisted 有哪些传输数据的选项。

使用 SOAP,我会有这样的方法:

- sendDiskUsage(DiskUsage class instance)
- sendProcesses(ProcessList class instance)
- etc..

我想知道 Twisted 有哪些选项。其中之一是 XML-RPC 可以,但它不是我最喜欢的......

edit2:通信将是“双向” - 客户端将从服务器读取任务...

【问题讨论】:

  • 只是关于格式化您的问题的注释:使用 SO' 降价,不要直接包含 HTML 标记。
  • +1 表示“比肥皂更蟒蛇”。
  • 我很困惑 - 为什么 Tornado 会涉及到这里?你在用旋风吗? github.com/fiorix/cyclone

标签: python twisted


【解决方案1】:

我推荐AMP。这是一个非常简单的基于键值对的协议,非常适合您正在做的事情。 Perspective broker 是另一种选择。但它有点复杂,而且通常是不必要的。

AMP 直接在 TCP 上运行(为什么要使用 HTTP?),序列化格式既简单又合乎逻辑。就您可能的意思而言,这使它成为“轻量级”和“pythonic”,但这些术语可以用几种不同的方式解释。

查看Twisted code examples 上的 AMP 示例,它们的内容非常不言自明。 AMP 连接是双向的,因此请尝试修改示例,以便服务器向客户端询问其当前磁盘使用情况。 twisted.protocols.amp API 文档在这里很有用。

当您准备好构建真正的应用程序时,请阅读 Twisted from Scratch, or The Evolution of Finger

AMP 已在大多数流行语言中实现,但如果您正在寻找更“主流”的东西,protobuf 是 Google 的产品。 IMO 它过于复杂,缺乏一些重要的功能,如错误反馈。

【讨论】:

  • +1,很好的选项总结;但是透视代理确实是 SOAP 的一个很好的类比,它在修复远程应用程序中 pickle 的许多弱点方面有很长的路要走,当两个对等点都是 python 时,它绝对值得仔细研究。
  • 哎哟! “肥皂的好模拟”!它烧毁了。咳咳。不过实话说。 AMP 作为首选可能是一个好主意。如果结果不方便,那么切换到 PB 相当简单。相反的事情不是那么容易做到的,因为 PB 为您提供了远程引用、可缓存和各种其他东西,同时使实际的 API 不如 AMP 那样明确。 AMP 的功能确实不如 PB,但有时这本身就是一个功能。
【解决方案2】:

您可以试试twisted 的“透视经纪人”。它有一些不错的特性,例如对称性(一旦建立连接,客户端和服务器之间就没有真正的区别)。它负责序列化本身。如果您只想要简单的单向状态更新推送,它可能不是最佳选择。

【讨论】:

    【解决方案3】:

    对于数据序列化,如果您使用 pickle 序列化自定义类实例,请确保服务器和客户端在全局命名空间中具有相同的类定义。

    对于扭曲的参考,你可以看看它的documentation,尤其是'Writing a TCP server'和'Writing a TCP client'部分。

    【讨论】:

      【解决方案4】:

      如果服务器和客户端都是用 Python 编写的,最简单的方法就是从客户端向服务器发出 HTTP POST 请求,并将数据序列化为腌制的 Python 对象。 Pickles 将承载所有原始对象结构。

      如果客户端是非 Python 进程,那么 JSON 是可行的方法 - 您只需将对象序列化为 JSON。 pickle 和 JSON 的区别在于 JSON 不能传输类,只能传输数据作为嵌套列表和 dicts。

      带有 JSON 负载的 HTTP POST - 这就是我要做的。

      不要打扰 SOAP。 WSDL 等只是给流程增加了额外的复杂性,非常不符合 Python 风格,而且 Python SOAP 库不是那么健壮。

      Twisted 文档没有涵盖这类东西,因为这是一个通用的 Python 问题,不是 Twisted 特有的。

      【讨论】:

      • 嗯,我更想看看如何使用 Twisted 的反应器,透视代理等。我同意 pickle/JSON 是比 SOAP 更好的发送数据的方式(因为 Python 中没有真正好的 SOAP 服务器端库)。我将在我的问题中补充一点,客户端和服务器端都是 Python。
      • HTTP POST 比 AMP 或 PB 方法调用困难得多。
      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 2013-05-31
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多