4

我想使用 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吗?

4

1 回答 1

2

文档的这一部分

有时服务器需要成为消息的发起者。这对于向客户端发送源自服务器的事件的通知很有用。socketio.send() 和 socketio.emit() 方法可用于向所有连接的客户端广播:

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

emit不是 from from flask.ext.socketio import SocketIO, send,而是调用您的socketio变量 from socketio = SocketIO(app)。如果你完成了socketio_connection = SocketIO(app),那么你会打电话socketio_connection.emit()来广播你的数据。

于 2014-11-12T20:58:35.043 回答