2016-08-04 17 views
1

Wenn ich versuche, eine Socket-Nachricht außerhalb des SocketIO-Ereigniskontexts zu senden, wird die Nachricht nicht beim Client ankommen.Senden von Ereignissen außerhalb von Flask SocketIO-Ereigniskontext

Methode außerhalb des Kontexts:

@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' 

ich auch versucht:

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

Auf dem SocketIO Kontext '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 

Die Methode update_client wird aufgerufen, aus einem Thread.

Auf der Seite Auftraggeber:

$(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); 
}); 

Als ich die emit('import', 'test') im @socketio.on('connect') Methode aufrufen, die Nachrichten auf dem Client eintrifft und die Log-Nachricht gedruckt wird.

Es gibt ein Beispiel in der Dokumentation:

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

Habe ich etwas verpasst oder warum die Nachricht nicht an den Kunden ankommen?

Edit:

Die socketio in der app/__init__.py Funktion erstellt wird

socketio = SocketIO() 
create_app(): 
    app = Flask(__name__) 
    socketio.init_app(app) 

manage.py

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

Flask-SocketIO == 2.6

eventlet == 0,19. 0

Antwort

0

Ich habe eine Lösung gefunden.

Wenn ich die Anwendung mit dem flascheninternen Server ausführe, werden die Nachrichten vom Client nicht empfangen.

python manage.py run 

Aber wenn ich den Server mit Gunicorn laufen funktioniert alles wie ein Charme.

Also die Lösung hier ist die Verwendung des Gunicorn mit Eventlet.

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

Ich benutze Flask 0.11 mit Flask-Migrate 2.0. Vielleicht habe ich etwas verpasst, da Flask 0.11 einen neuen Startbefehl hat.