Flask:A RESTful API 和 SocketIO 服务器

Flask: A RESTful API and SocketIO Server

背景

我正在尝试使用 Flask-RESTful 扩展创建一个简单的 REST API。此 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 发出请求以检查特定用户是否 authenticated/authorized 连接到特定套接字?

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

之所以可行,是因为在幕后,Flask-SocketIO 运行基于 gevent(或 1.0 版本,还有 eventlet)的事件 web 服务器 - 该服务器直接处理 websocket 请求(使用您通过 socketio.on 装饰器注册的处理程序)并将非 websocket 请求传递给 Flask。

你的代码没有工作的原因是因为app.runsocketio.run都是阻塞操作.无论哪个 运行 第一个正在循环,等待连接,从不允许第二个启动。如果你真的 需要 到 运行 你在不同端口上的 websocket 连接,你需要在不同的进程上生成 socketio 或应用程序 run 调用。