从Flask SocketIO事件上下文发送事件

时间:2016-08-04 22:20:56

标签: python flask flask-socketio

当我尝试从SocketIO事件上下文向外发送套接字消息时,消息不会到达客户端。

上下文之外的方法:

@main.route('/import/event', methods=['POST'])
def update_client():
   from .. import socketio
   userid = request.json['userid']
   data = request.json
   current_app.logger.info("New data: {}".format(data))
   current_app.logger.info("Userid: {}".format(userid))
   socketio.emit('import', data, namespace='/events', room=userid)
   return 'ok'

我也尝试过:

    with current_app.app_context():
        socketio.emit('import', data, namespace='/events', room=userid)

关于SocketIO上下文' on.connect'

@socketio.on('connect', namespace='/events')
def events_connect():
    current_app.logger.info("CONNECT {}".format(request.namespace))
    userid = request.sid
    current_app.clients[userid] = request.namespace

将从线程调用方法update_client。

在客户端:

$(document).ready(function(){
  var socket = io.connect('http://' + document.domain + ':' + location.port +'/events');
  var userid;

socket.on('connect', function() {
    console.log("on connect");
});

socket.on('import', function (event) {
  console.log("On import" +event);
});

当我在emit('import', 'test')方法中调用@socketio.on('connect')时,消息到达客户端并打印日志消息。

文档中有一个例子:

@app.route('/ping')
def ping():
    socketio.emit('ping event', {'data': 42}, namespace='/chat')

我是否遗漏了某些内容或者为什么邮件没有到达客户端?

编辑:

socketio是在app/__init__.py函数

中创建的
socketio = SocketIO()
create_app():
   app = Flask(__name__)
   socketio.init_app(app)

manage.py

from app import socketio
if __name__ == '__main__':
    socketio.run(app)

烧瓶SocketIO == 2.6

eventlet == 0.19.0

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

当我使用flask内部服务器运行应用程序时,客户端不会收到消息。

python manage.py run

但是,当我使用gunicorn运行服务器时,所有功能都像魅力一样。

所以这里的解决方案是使用带有eventlet的gunicorn。

gunicorn --worker-class eventlet -w 1 manage:app

我使用Flask 0.11和Flask-Migrate 2.0。也许我错过了一些东西,因为Flask 0.11有一个新的启动命令。