2016-08-04 98 views
1

当我尝试从SocketIO事件上下文以外发送套接字消息时,消息未到达客户端。从Flask 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); 
}); 

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

还有就是文档中的例子:

@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

回答

0

我找到了解决方案。

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

python manage.py run 

但是,当我运行服务器与gunicorn所有作品像一个魅力。

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

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

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