Как разделить переменные между обработчиками сокетов?

Есть ли способ дать нескольким обработчикам сокетов доступ к одной и той же переменной? Ниже приведен фрагмент псевдокода, показывающий, чего я хочу достичь, но я получаю исключение UnboundLocalVariable для shared_variable,

shared_variable = None

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

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

Какие-нибудь мысли? Заранее спасибо!

1 ответ

Решение

Если вы хотите использовать глобальную переменную, вы должны объявить ее как таковую в функциях, иначе каждая функция будет иметь свою локальную переменную.

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'])

Важно отметить, что в том, как session ведет себя в событиях Socket.IO по сравнению с обычными маршрутами HTTP-запросов. Сеанс пользователя HTTP копируется на сторону Socket.IO при подключении клиента, и с тех пор все изменения, которые вы вносите в события Socket.IO, доступны только для событий, инициированных этим клиентом. Изменения, внесенные в сеанс в событиях Socket.IO, не отображаются в HTTP-запросах.

Другие вопросы по тегам