Как разделить переменные между обработчиками сокетов?
Есть ли способ дать нескольким обработчикам сокетов доступ к одной и той же переменной? Ниже приведен фрагмент псевдокода, показывающий, чего я хочу достичь, но я получаю исключение 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-запросах.