2015-09-13 10 views
6

HintergrundFlask: Ein RESTful API und SocketIO Server

Ich versuche, einen einfachen REST-API der Kolben-RESTful Erweiterung erstellen verwenden. Diese API wird hauptsächlich für die Verwaltung der CRUD und die Authentifizierung von Benutzern für einen einfachen Dienst verwendet.

Ich versuche auch, einige Web-Sockets mit der Flask-SocketIO-Erweiterung zu erstellen, mit denen diese Benutzer eine Verbindung herstellen können und Echtzeit-Updates für einige Daten zu anderen Personen, die den Dienst verwenden, anzeigen. Daher muss ich wissen, dass diese Benutzer authentifiziert und berechtigt sind, sich mit bestimmten Sockets zu verbinden.

Problem

Allerdings habe ich ein wenig Mühe aufgebaut zu werden. Es scheint, als ob ich nicht in der Lage bin, diese beiden Komponenten (die REST-API und der SocketIO-Server) in derselben Flask-Instanz zusammenarbeiten zu lassen. Der Grund, warum ich sage dies, weil, wenn ich folgendes ausführen, entweder die REST-API oder die SocketIO Server funktioniert, aber nicht beides:

from flask import Flask 
from flask_restful import Api 
from flask.ext.socketio import SocketIO 

app = Flask(__name__) 

api = Api(app) 
socketio = SocketIO(app) 

# some test resources for the API and 
# a test emitter statement for the SocketIO server 
# are added here 

if __name__ == '__main__': 
    app.run(port=5000) 
    socketio.run(app, port=5005) 

Frage

ist die typische Lösung für diese Art von eingerichtet, um zwei verschiedene Instanzen von Flask zur gleichen Zeit gehen zu lassen? Zum Beispiel müsste mein SocketIO-Server Anforderungen an meine REST-API stellen, um zu überprüfen, ob ein bestimmter Benutzer authentifiziert/berechtigt ist, sich mit einem bestimmten Socket zu verbinden?

+0

Was passiert, wenn Sie * shootio.run (app, port = 5005) einfach verwenden und versuchen, die REST-API an Port 5005 zu erreichen? –

+0

@SeanVieira Aus irgendeinem Grund funktioniert das gut ... Ich nehme einfach meine API und Sockets auf dem gleichen Port dann – nmagerko

Antwort

11

Sie wollen einfach nur socketio.run(app, port=5005) und drücken Sie die REST-API auf Port laufen 5005.

Der Grund dieser Arbeiten ist, weil unter der Haube, Flask-SocketIO ist ein evented Webserver basiert auf GEVENT läuft (oder mit der Version 1.0 , auch eventlet) - dieser Server behandelt die WebSocket-Anfragen direkt (unter Verwendung der Handler, die Sie über den socketio.on Decorator registrieren) und gibt die Nicht-Websocket-Anfragen an Flask weiter.

Der Grund Code war nicht Arbeits ist, weil beide app.run und socketio.run sind blockiert Operationen. Was auch immer zuerst lief, war Looping, wartete auf Verbindungen und ließ niemals den zweiten los. Wenn Sie wirklich benötigt, um Ihre Websocket-Verbindungen auf einem anderen Port auszuführen, müssen Sie entweder die socketio oder die App run auf einem anderen Prozess aufrufen.

+4

Große Antwort, aber ich wollte feststellen, dass Flask-SocketIO ist dabei, die exklusive Abhängigkeit zu brechen gevent. Entwicklungsversion 1.0a1 der Erweiterung kann gevent, eventlet oder gar plain Werkzeug verwenden (obwohl letztere ohne WebSocket-Unterstützung läuft). – Miguel

+0

Die beste Antwort. – piyush121