18

背景

我正在尝试使用 Flask-RESTful 扩展创建一个简单的 REST API。此 API 将主要用于管理简单服务的 CRUD 和用户身份验证。

我还尝试使用 Flask-SocketIO 扩展创建一些 Web 套接字,这些用户将能够连接到这些用户并查看与使用该服务的其他人相关的某些数据的实时更新。因此,我需要知道这些用户经过身份验证并被授权连接到某些套接字。

问题

但是,我在设置时遇到了一些麻烦。似乎我无法让这两个组件(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 发出请求才能检查特定用户是否经过身份验证/授权以连接到特定套接字?

4

1 回答 1

31

您只想socketio.run(app, port=5005)在端口 5005 上运行并点击 REST API。

这样做的原因是因为在后台,Flask-SocketIO 正在运行一个基于 gevent(或 1.0 版本,也是 eventlet)的事件网络服务器 - 该服务器直接处理 websocket 请求(使用您通过socketio.on装饰器注册的处理程序)和正在将非 websocket 请求传递给 Flask。

您的代码无法正常工作的原因是两者app.runsocketio.run阻塞操作。无论哪个先运行,都在循环,等待连接,永远不允许第二个启动。如果您确实需要在不同的端口上运行 websocket 连接,则需要在不同的进程上生成 socketio 或应用程序run调用。

于 2015-09-13T03:56:01.310 回答