实现发布-订阅模式时如何在 Django 和 Twisted 之间进行通信?
Posted
技术标签:
【中文标题】实现发布-订阅模式时如何在 Django 和 Twisted 之间进行通信?【英文标题】:How to communicate between Django and Twisted when implementing a publish-subscribe pattern? 【发布时间】:2014-03-30 03:48:47 【问题描述】:我正在使用 Python 和 Autobahn(基于 Twisted 构建的东西)实现一个 WebSocket 服务器。让我的 Autobahn/Twisted 服务器知道我的 Django 应用程序中发生了某些事情的最佳方式是什么?
更具体地说,我正在实现一个通知服务和即时更新服务,它可以自动让我的客户端应用程序知道什么时候发生了变化以及需要更新什么。
有什么方法可以让 Django “发布”到我的 Twisted 服务器,然后更新客户端?我不太确定这一切应该是什么样子。
谢谢
【问题讨论】:
这些作品如何相互关联?你是否在 Twisted 的 WSGI 容器中运行 Django(如果没有,为什么不)?它们是独立的过程吗?它们是否在同一主机上运行? 它们是独立的进程。现在唯一与它们相关的是它们都使用 models.py 来检查同一个数据库的更新。 你可能会重新考虑在 Twisted 的 WSGI 容器下运行 Django。如果你这样做了,通过 Autobahn 从 Django 发布(然后在后台工作线程池上运行)就像callFromThread
到在主线程上运行的 Autobahn 一样简单,然后发布。
这里是基本位(易于扩展以使用高速公路):github.com/oberstet/scratchbox/blob/master/python/twisted/wsgi/…
【参考方案1】:
进行进程间通信的方法有几十或几百种。例如,您可以通过在一个进程中运行 HTTP 服务器并在另一个进程中使用 HTTP 客户端来使用 HTTP。
协议的具体选择可能并不重要。您需要的通信类型的特定细节可能会建议使用一种协议而不是其他协议。如果您的需求范围只是提供“发生某事”的通知,那么一个非常简单的协议可能就可以完成这项工作。
【讨论】:
那么在 Twisted 或 Django 中会怎样呢?我希望我的 Twisted 服务器发送几个不同的更新,它们都取决于连接的客户端。我只想发送相关的更新。流程如下:在 Django 中发生了一些事情 -> 扭曲的服务器以某种方式获取了它(这就是你的答案出现的地方) -> 客户端接收到更新并做一些事情。 例如,您可能会在 twisted 中运行 Web 服务器(实例化twisted.web.server.Site
),然后使用来自 Django 的客户端(使用 urllib
、urllib2
、urllib3
、@ 987654325@,或 Python 中其他几十个 HTTP 客户端库中的任何一个)。【参考方案2】:
您看过 autobahn.js 库吗?您可以直接从浏览器连接到您的 webscoket 后端。不仅可以调用 autobahn RPC api,还可以做 pub/sub。
http://autobahn.ws/js/
制作一个支持 RPC 端点的高速公路服务器,而 pubsub 是基本答案。当客户端连接时,服务器发送它可以访问的 RPC 端点,客户端可以随意调用它们,客户端也可以订阅频道,然后服务器可以调用发布 API 将消息推送到任何订阅的客户端.不知道你有没有看过,但是有很多各种配置的例子github.com/tavendo/AutobahnPython/tree/master/examples/twisted/... –
【讨论】:
我的问题提到了高速公路。我想要的比这更具体一点。 制作一个支持 RPC 端点的高速公路服务器,而 pubsub 是基本答案。当客户端连接时,服务器发送它可以访问的 RPC 端点,客户端可以随意调用它们,客户端也可以订阅频道,然后服务器可以调用发布 API 将消息推送到任何订阅的客户端.不知道你有没有看过,但是有很多各种配置的例子github.com/tavendo/AutobahnPython/tree/master/examples/twisted/… 这很有帮助!请将其添加到您的答案中,然后我会接受。以上是关于实现发布-订阅模式时如何在 Django 和 Twisted 之间进行通信?的主要内容,如果未能解决你的问题,请参考以下文章