我正在构建一个可与Web客户端(Django)和远程API(可能是独立守护程序)一起使用的系统。我看到将它们的工作与JavaScript中的某些事件框架进行协调比较容易。不幸的是,Django信号是同步的,这会使回复客户端的速度很慢。另外,我可能希望能够将守护程序或其部分迁移到单独的计算机上,但仍以相同的方式工作(不是RPC,而是仅触发事件或发送消息)。(这听起来像是Erlang的方法。)
是否有一个框架可以使用经过验证的可靠方法在流程之间进行通信(例如RabbitMQ),并且需要最少的模板?
至于AndreParamé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 views文件。还有一个独立的守护程序脚本,它可以无限运行并对事件做出反应。
这只是伪代码,我只是说它应该很容易。
# 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.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。