gevent-socketio отправить сообщение из потока

Я хотел бы использовать gevent-socketio для отправки сообщений из рабочего потока и обновления всех подключенных клиентов о статусе задания.

Я пробовал это:

from flask import Flask, render_template
from flask.ext.socketio import SocketIO, send, emit
import threading
import time

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@socketio.on('message')
def handle_message(message):
    send(message, broadcast=True)

@app.route('/')
def index():
    return render_template('index.html')

def ping_thread():
    while True:
        time.sleep(1)
        print 'Pinging'
        send('ping')

if __name__ == '__main__':
    t = threading.Thread(target=ping_thread)
    t.daemon = True
    t.start()
    socketio.run(app)

И это дает мне эту ошибку:

RuntimeError: working outside of request context

Как отправлять сообщения из функции, у которой нет декоратора @socketio.on()? Могу ли я напрямую использовать gevent для отправки сообщений socketio?


person Luke Yeager    schedule 12.11.2014    source источник


Ответы (1)


Из этого раздела документации:

Иногда сервер должен быть отправителем сообщения. Это может быть полезно для отправки уведомления клиентам о событии, произошедшем на сервере. Методы socketio.send() и socketio.emit() можно использовать для трансляции всем подключенным клиентам:

def some_function():
    socketio.emit('some event', {'data': 42})

Этот emit не из from flask.ext.socketio import SocketIO, send, а вместо этого вызывается вашей переменной socketio из socketio = SocketIO(app). Если бы вы сделали socketio_connection = SocketIO(app), вы бы звонили socketio_connection.emit() для передачи своих данных.

person Celeo    schedule 12.11.2014
comment
На самом деле я не видел этого раздела в документации (черт возьми!). Но это именно то, что я все равно пытался сделать (см. Мой код выше), и, похоже, это не работает для меня. - person Luke Yeager; 13.11.2014
comment
Вы звоните emit, но в ссылке написано звонить socketio.emit - person Celeo; 13.11.2014
comment
Спасибо за отзыв, @Celeo. Я обновил свой пост, чтобы включить больше моего кода. Как видите, я импортирую emit и send напрямую, а не socketio, так что это не моя проблема. - person Luke Yeager; 13.11.2014