2015-09-13 67 views
6

TłoKolba: spokojny API i SocketIO Server

Próbuję utworzyć prosty REST API używając rozszerzenia Kolba-spokojny. Ten interfejs API będzie działać przede wszystkim w celu zarządzania CRUD i uwierzytelniania użytkowników dla prostej usługi.

Próbuję również utworzyć kilka gniazd internetowych za pomocą rozszerzenia Flask-SocketIO, z których użytkownicy będą mogli się łączyć i oglądać aktualizacje w czasie rzeczywistym dla niektórych danych związanych z innymi osobami korzystającymi z usługi. W związku z tym muszę wiedzieć, że ci użytkownicy są uwierzytelnieni i upoważnieni do łączenia się z określonymi gniazdami.

Problem

Jednak mam trochę kłopotów z konfiguracją. Wygląda na to, że nie mogę mieć tych dwóch komponentów (REST API i serwera SocketIO) współpracujących w tej samej instancji Flask. Dlatego mówię to dlatego, że gdy uruchamiam następujące, albo API REST lub serwer SocketIO będzie działać, ale nie oba:

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) 

Pytanie

jest typowym rozwiązaniem dla tego typu skonfigurować, aby miały dwa odrębne instancje Flasku w tym samym czasie? Na przykład, czy mój serwer SocketIO musi wysyłać żądania do mojego interfejsu REST API, aby sprawdzić, czy określony użytkownik jest uwierzytelniony/autoryzowany do połączenia z konkretnym gniazdem?

+0

Co się stanie, jeśli * po prostu * użyjesz 'socketio.run (app, port = 5005)' i spróbujesz trafić na REST API na porcie 5005? –

+0

@SeanVieira Z jakiegoś powodu to działa dobrze ... Przypuszczam, że po prostu utrzymam swoje API i gniazda na tym samym porcie, następnie – nmagerko

Odpowiedz

11

Po prostu chcemy uruchomić socketio.run(app, port=5005) i uderzył API REST na porcie 5005.

Powodem tego jest, ponieważ pracuje pod maską, kolba-SocketIO uruchomiony jest serwer WWW i walczył na podstawie gevent (lub wraz z wydaniem 1.0 , także eventlet) - ten serwer bezpośrednio obsługuje żądania websocket (za pomocą procedur obsługi zarejestrowanych przez dekorator socketio.on) i przekazuje żądania non-websocket do Flask.

Powodem kod nie było pracy jest ponieważ zarówno app.run i socketio.runblokujące operacje. Bez względu na to, który z nich był uruchomiony, zapętlono, czekając na połączenia, nigdy nie pozwalając, by sekunda się rozpoczęła. Jeśli naprawdę chcesz potrzebować do uruchamiania połączeń z internetem na innym porcie, musisz odradzać wywołanie socketio lub app run w innym procesie.

+4

Świetna odpowiedź, ale chciałem zauważyć, że Flask-SocketIO wkrótce złamie wyłączną zależność gevent. Wersja rozwojowa 1.0a1 rozszerzenia może wykorzystywać gevent, eventlet lub nawet zwykły Werkzeug (chociaż ten ostatni działa bez obsługi WebSocket). – Miguel

+0

Najlepsza odpowiedź. – piyush121