20

gevent-socketio Django アプリケーションを実行しています。

私はこのクラスに似たものを持っています

@namespace('/connect')
class ConnectNamespace(BaseNamespace):

    def on_send(self, data):
        # ...

ただし、JavaScript クライアントからイベントを受信すると、すべてが機能し、たとえばsendイベントが正しく処理されます。

emitサーバー側で何らかのイベントが必要な場合、私は少し迷っています。私はクラス内でそれを行うことができますsocket.send_packet

しかし、今、いくつかのイベントをpost_saveシグナルにリンクしたいので、send_packetこの名前空間クラスの外からしたいのですが、これを行う1つの方法は次のようになります

ConnectNamespaceInstance.on_third_event('someeventname')

ConnectNamespaceInstance のインスタンスを取得する方法がわかりません

post_save要約すると、シグナルを受信した後、JavaScriptクライアントにイベントを送信したいだけです

4

2 に答える 2

7

おそらくやりたいことは_connections、次のように、接続を追跡するモジュール変数を追加することです。

_connections = {}

@namespace('/connect')
class ConnectNamespace(BaseNamespace):

そして、後で参照できる幸せな識別子を使用するメソッドを追加initializeします。disconnect

def initialize(self, *args, **kwargs):
    _connections[id(self)] = self
    super(ConnectNamespace, self).initialize(*args, **kwargs)

def disconnect(self, *args, **kwargs):
    del _connections[id(self)]
    super(ConnectNamespace, self).disconnect(*args, **kwargs)

イベントを生成する必要がある場合は、_connections変数で正しい接続を検索し、 でイベントを発生させることができますemit

(これはテストしませんでしたが、他の多くの言語で同様のパターンを使用しました。これが Python でも機能しない理由はわかりません)。

于 2013-05-29T17:25:21.283 に答える