グローバル変数を使用する場合は、関数内でグローバル変数を宣言する必要があります。そうでなければ、各関数はそれぞれ独自のローカル変数を持ちます。
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要求では表示されません。
ありがとうございます!私がセッション変数に入れなければならないことに関するベストプラクティスはありますか?リモートサービスのためのチャンネルスタブはいかがですか? – Marcus
任意のPythonオブジェクトをSocket.IOユーザセッションに書くことができます。 – Miguel