Flask:RESTful API和SocketIO服务器

时间:2015-09-13 02:06:05

标签: python flask flask-restful flask-socketio

背景

我正在尝试使用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发出请求才能检查特定用户是否经过身份验证/授权连接到特定套接字?

1 个答案:

答案 0 :(得分:19)

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

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

您的代码的原因是因为app.runsocketio.run都是阻止操作。无论哪一个先跑,都是循环,等待连接,永远不要让第二个开始。如果你真的需要在另一个端口上运行你的websocket连接,你需要在另一个进程上产生socketio或app run调用。