Я создаю систему, которая работает с веб-клиентами (Django) и удаленными API (вероятно, автономный демон). Я вижу, что проще координировать их работу с каким-то фреймворком событий, например, в JavaScript. К сожалению, сигналы Django синхронны, что делает ответы клиентам очень медленными. Кроме того, я мог бы захотеть иметь возможность перенести демон или его часть на отдельную машину, но при этом работать так же (не RPC, а просто запускать событие или отправлять сообщение). (Это может звучать как подход Erlang.)
Существует ли инфраструктура, которая использовала бы проверенные и надежные способы связи между процессами (скажем, RabbitMQ) и требовала бы минимального шаблонного кода?
Что касается 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.