2015-09-13 4 views
6

фонНастой: успокоительной API и SocketIO Сервер

Я пытаюсь создать простой REST API с помощью Колба-RESTful расширение. Этот API будет работать в основном для управления CRUD и аутентификации пользователей для простой службы.

Я также пытаюсь создать несколько веб-сокетов с помощью расширения Flask-SocketIO, с помощью которого эти пользователи смогут подключаться и просматривать обновления в режиме реального времени для некоторых данных, связанных с другими людьми, использующими эту службу. Поэтому мне нужно знать, что эти пользователи аутентифицированы и авторизованы для подключения к определенным сокетам.

Проблема

Однако, у меня немного хлопот получать настройки. Похоже, что я не могу использовать эти два компонента (REST API и сервер SocketIO) вместе в одном экземпляре Flask. Поэтому я говорю это потому, что когда я запускаю следующий, либо REST API или сервер SocketIO будет работать, но не так:

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) 

Вопрос

Является типичным решением для этого типа настроить, чтобы одновременно иметь два разных экземпляра Flask? Например, должен ли мой SocketIO-сервер выполнять запросы к моему REST API, чтобы проверить, что конкретный пользователь аутентифицирован/авторизован для подключения к определенному сокету?

+0

Что произойдет, если вы * просто * используете 'socketio.run (app, port = 5005)' и попытаетесь попасть в REST API на порт 5005? –

+0

@SeanVieira По какой-то причине это прекрасно работает ... Полагаю, что я просто сохраню свой API и сокеты в одном и том же порту, а затем – nmagerko

ответ

11

Вы просто хотите запустить socketio.run(app, port=5005) и нажмите REST API на порт 5005.

Причина это работает, потому что под капотом, Колба-SocketIO работает под evented веб-сервер на основе GEvent (или с выходом 1,0 , также eventlet) - этот сервер обрабатывает запросы websocket напрямую (используя обработчики, которые вы регистрируете через декоратор socketio.on) и передает запросы, не связанные с websocket, в Flask.

Причина код не рабочий потому, что как app.run и socketio.run являются блокирующие операции. Какой бы ни был первый запуск, он зацикливался, ожидая соединений, не позволяя второму начать. Если вам действительно нужен , чтобы запускать ваши подключения к сети в другом порту, который вам нужен, чтобы вызвать либо сокету, либо приложение run, вызовите другой процесс.

+4

Отличный ответ, но я хотел бы отметить, что Flask-SocketIO вот-вот разорвет исключительную зависимость от GEvent. В выпуске разработки 1.0a1 расширения можно использовать gevent, eventlet или даже простой Werkzeug (хотя последний работает без поддержки WebSocket). – Miguel

+0

Лучший ответ. – piyush121

 Смежные вопросы

  • Нет связанных вопросов^_^