Sto costruendo un sistema che funziona con i client Web (Django) e le API remote (probabilmente un daemon standalone). Vedo che è più facile coordinare il loro lavoro con alcuni framework di eventi come in JavaScript. Sfortunatamente, i segnali di Django sono sincroni, il che renderà le risposte molto lente ai clienti. Inoltre, potrei voler migrare il daemon o la sua parte su una macchina separata, ma funziona sempre allo stesso modo (non RPC, ma semplicemente attivando un evento o inviando un messaggio). (Potrebbe sembrare l'approccio di Erlang.)Framework di eventi per Python?
Esiste un framework che utilizzi metodi comprovati e affidabili per comunicare tra processi (ad esempio, RabbitMQ) e richiedere un numero di piastre minimo?
Per quanto riguarda Twisted, suggerito da André Paramés, preferirei un codice più semplice. Questo è fattibile in 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)
Ecco ulteriori dettagli. C'è un file di viste Django che utilizza alcuni modelli e notifica altri di eventi. E c'è uno script daemon standalone che funziona all'infinito e reagisce agli eventi.
Questo è solo codice pseudo, intendo solo quanto sia facile.
# 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})
Ancora una volta, questo non poteva essere fatto solo con i segnali di Django: alcuni eventi devono essere pubblicati sulla rete, gli altri dovrebbero essere locale, ma asincrona.
Potrebbe essere necessario fare un'istanza di qualcosa, come
from events_framework import Environment
env = Environment() # will connect to default rabbitmq server from settings.
Perché hai taggato questo 'javascript'? Non è davvero correlato. Per quanto riguarda un framework basato su eventi, hai visto [Twisted] (http://twistedmatrix.com/trac/)? –
Rimosso i tag JS & Erlang ... –
Il loro esempio di buongiorno mi ha fatto grattarmi la testa. Quanta caldaia o codice strano richiede? –