2016-05-25 5 views
0

複数のソケットハンドラに同じ変数へのアクセスを与える方法はありますか?以下は私が達成したいものを示す疑似コードですが、shared_variableのUnboundLocalVariable例外が発生しています。ソケットハンドラ間で変数を共有する方法は?

shared_variable = None 

@socketio.on('initialize') 
def initialize_variable(data): 
    shared_variable = data 

@socketio.on('print') 
def print_variable(): 
    print str(shared_variable) 

前もって感謝します!

答えて

2

グローバル変数を使用する場合は、関数内でグローバル変数を宣言する必要があります。そうでなければ、各関数はそれぞれ独自のローカル変数を持ちます。

shared_variable = None 

@socketio.on('initialize') 
def initialize_variable(data): 
    global shared_variable 
    shared_variable = data 

@socketio.on('print') 
def print_variable(): 
    global shared_variable 
    print str(shared_variable) 

ただし、これを行うと、すべてのクライアントが同じ変数を共有することに注意してください。より興味深い解決策は、各クライアントが独自の値を持つため、ユーザーセッションを使用して値を格納することです。

@socketio.on('initialize') 
def initialize_variable(data): 
    session['shared_variable'] = data 

@socketio.on('print') 
def print_variable(): 
    print str(session['shared_variable']) 

それはどのようにいくつかの違いがあることに注意することが重要ですSocket.IOイベント対通常のHTTPリクエストのルートでsessionふるまいます。 HTTPユーザセッションは、クライアントが接続するときにSocket.IO側にコピーされます。その後、Socket.IOイベントの変更は、そのクライアントによってトリガされたイベントでのみ使用できます。 Socket.IOイベントでセッションに加えられた変更は、HTTP要求では表示されません。

+0

ありがとうございます!私がセッション変数に入れなければならないことに関するベストプラクティスはありますか?リモートサービスのためのチャンネルスタブはいかがですか? – Marcus

+0

任意のPythonオブジェクトをSocket.IOユーザセッションに書くことができます。 – Miguel

関連する問題