【发布时间】:2012-06-24 18:58:02
【问题描述】:
我正在构建一个与 Web 客户端 (Django) 和远程 API(可能是一个独立的守护程序)一起使用的系统。我发现将他们的工作与 JavaScript 等事件框架协调起来更容易。不幸的是,Django 信号是同步的,这会使对客户端的回复非常缓慢。此外,我可能希望能够将守护进程或其部分迁移到单独的机器上,但仍以相同的方式工作(不是 RPC,只是触发事件或发送消息)。 (这听起来像是 Erlang 的方法。)
是否有一个框架可以使用经过验证且可靠的方式在进程之间进行通信(例如,RabbitMQ),并且需要最少的样板文件?
至于 André Paramés 建议的 Twisted,我更喜欢更简单的代码。这在 Twisted 中可行吗?
from events_framework import subscribe, trigger
from django.http import Client
http_client = Client() # just a sample
@subscribe('data_received'):
def reply(data):
http_client.post('http://www.example.com', data)
trigger('data_resent', data)
这里有更多细节。有一个 Django 视图文件,它使用一些模型并通知其他事件。还有一个独立的守护程序脚本,可以无限运行并对事件做出反应。
这只是伪代码,我只是说它应该多么容易。
# django_project/views.py (a Django views file)
from events_framework import publish, subscribe
from annoying import
@subscribe('settings_updated')
def _on_settings_update(event): # listens to settings_updated event and saves the data
Settings.object.get(user__id=event.user_id).update(event.new_settings)
@render_to('form.html')
def show_form(request): # triggers 'form_shown' event
publish('form_shown', {'user_id': request.user.id, 'form_data': request.GET})
return {...}
# script.py (a standalone script)
from events_framework import publish, subscribe
@subscribe('form_shown')
def on_form_shown(event): # listens to form_shown event and triggers another event
pass
result = requests.get('third party url', some_data)
publish('third_party_requested', {'result': result})
同样,这不能仅使用 Django 信号来完成:一些事件需要通过网络发布,其他事件应该是本地的但异步的。
可能需要实例化一些东西,比如
from events_framework import Environment
env = Environment() # will connect to default rabbitmq server from settings.
【问题讨论】:
-
你为什么要标记这个
javascript?这不是真的相关。至于事件驱动的框架,你见过Twisted吗? -
移除了 JS & Erlang 标签...
-
他们的 hello world 例子让我摸不着头脑。它需要多少样板或奇怪的代码?
-
你在说什么你好世界的例子?这个问题确实需要更多细节。
-
您可能需要阅读比首页上的示例更多的内容才能了解如何使用 Twisted。抱歉,并非宇宙中的所有信息都可以压缩到 140 个字符。
标签: python events twisted message-queue