2012-03-19 4 views
1

私のアプリケーションはtwisted「バックエンドサーバー」とdjango「ミドルウェア」で構成されています。ねじれた部分は、データベースにアクセスするために.tac fileに設定されたcollection of servicesであり、wwwまたはxmlでコンテンツを提供します。 djangoの部分は、ウェブサイト上のユーザとのやり取りをすべて処理します。どのようにDjangoからの通知をねじれに送信するには?

ねじれたWebサービスは、私がcanonical wayと思われるものでDjangoのWSGIアプリケーションをインスタンス化します。

# .../wsgi/app.py: 
from django.core.handlers.wsgi import WSGIHandler 
application = WSGIHandler() 

# .../web_service.py: 
# (twisted imports...) 
from wsgi.app import application 
class WebServer(Resource): 
    def __init__(self): 
     Resource.__init__(self) 
     self.wsgi_resource = WSGIResource(reactor, 
              reactor.getThreadPool(), 
              application) 

今、私はツイストにDjangoの一部から、たとえば、ユーザがログインしたことの通知を送信する必要がありますサービスの1つに理想的です。私は目的のためにdjango signalを使用しようとしています。信号作品を送信するが、私は本当に信号のためのターゲットとして機能するようにねじれたオブジェクトへの参照を取得する方法が表示されない:

  • サービスは、すべてのapp.tacでインスタンス化され、それがインポートすることができていないようですこれらのオブジェクトはそのファイルから取得するか、ツイストされたアプリケーションが実行されている間はそれらのオブジェクトへの参照を再取得します。
  • #twisted IRCチャンネルでは、私がそれをインスタンス化するときに私のシグナルのターゲットになるはずのサービスへの参照を渡すアドバイスを得ましたが、上のコードスニペットが示すように、django app単にWSGIHandlerオブジェクトであり、サービス参照を何とかそこに注入することができたとしても、アプリ内からアクセスする方法はわかりません。また、そのアプローチは、バックエンドとミドルウェアをむしろ強く結びつけることになります。これは、シグナルが最初に防止しようとするものです。

DjangoからTwistedに通知を送信するにはどうすればよいですか?

答えて

2

Django化された解決策はおそらくオブジェクトをsettings.pyに入れることです。もちろん、これはひどいことです。しかし、Djangoはこのグローバル状態に一貫して依存しているので、アプリケーションに状態を提供するための他の広く知られている、または使用されているメカニズムさえも持たないため、そのアプリケーションと一緒に暮らす必要があります。

あなたのtacファイルに次のようなものを追加することができます。

import settings 
settings.twisted_listener = your_service 

これは-ation「これ以上はおそらくありますがないクリーンな方法」としてはあまりお勧めではありません。これよりも優れた世界では、Djangoにはsettings.pyがありません。アプリケーションを構成するための引数を受け入れるAPIを備えています。

関連する問題