2016-08-04 46 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有一個新的啓動命令。