2

Crossbar.io を使用して、ライブ統計ページを実装し始めました。多くのコード例を見てきましたが、これを行う方法がわかりません:

私は Django サービスを持っており (混乱を避けるために、view.py の関数について話していると想定してください)、呼び出されるたびに特定のトピックでメッセージを公開したいと考えています。私はこれらのアプローチを見てきました: (1) ApplicationSession を拡張し、(2) "runned" である Application インスタンスを使用します

Djangoサービスはクラス内に存在せず、スタンドアロンのpythonファイルとしても実行されないため、それらのどれも機能しません。そのため、「公開」メソッドを呼び出す方法が見つかりません(つまり、サーバー側でやりたいことだけです)。

ApplicationSession を拡張した「StatsBackend」のインスタンスを取得して何かを公開しようとしたのですが... StatsBackend._instance は常に None です (「crossbar start」を実行して StatsBackend.init ( ) を呼び出しても)。

StatsBackend.py:

from twisted.internet.defer import inlineCallbacks
from autobahn import wamp
from autobahn.twisted.wamp import ApplicationSession

class StatsBackend(ApplicationSession):

    _instance = None

    def __init__(self, config):
        ApplicationSession.__init__(self, config)
        StatsBackend._instance = self

    @classmethod
    def update_stats(cls, amount):
        if cls._instance:
            cls._instance.publish('com.xxx.statsupdate', {'amount': amount})

    @inlineCallbacks
    def onJoin(self, details):
        res = yield self.register(self)
        print("CampaignStatsBackend: {} procedures registered!".format(len(res)))

test.py:

import StatsBackend

StatsBackend.update_stats(100) #Doesn't do anything, StatsBackend._instance is None
4

2 に答える 2

6

Django はブロッキング WSGI アプリケーションであり、非ブロッキング (Twisted または asyncio 上で実行される) である AutobahnPython とはうまく調和しません。

ただし、Crossbar.io には組み込みの REST ブリッジがあり、これにはHTTP/POST 対応のクライアントを介してイベントを送信できるHTTP プッシャーが含まれています。Crossbar.io は、これらのイベントを通常の WAMP サブスクライバーに転送します (たとえば、リアルタイムで WebSocket を介して)。

Crossbar.io には、上記の機能を示す完全なアプリケーション テンプレートも付属しています。試すには:

cd ~/test1
crossbar init --template pusher
crossbar start

http://localhost:8080(JS コンソールを開く) と 2 番目のターミナルでブラウザーを開きます。

curl -H "Content-Type: application/json" \
   -d '{"topic": "com.myapp.topic1", "args": ["Hello, world"]}' \
   http://127.0.0.1:8080/push

その後、Django などのブロッキング アプリケーション内からパブリッシュを実行できます。

于 2014-10-08T19:14:46.827 に答える