我想使用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
发送消息吗?
答案 0 :(得分:2)
来自this section of the documentation:
有时服务器需要成为消息的发起者。这对于向客户端发送源自服务器的事件的通知非常有用。 socketio.send()和socketio.emit()方法可用于向所有连接的客户端广播:
def some_function():
socketio.emit('some event', {'data': 42})
此emit
不是来自from flask.ext.socketio import SocketIO, send
,而是来自socketio
的{{1}}变量。如果你完成socketio = SocketIO(app)
,那么你就会打电话socketio_connection = SocketIO(app)
来广播你的数据。