Flask:RESTful API和SocketI

2024-06-13 12:22:02 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

我试图使用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)

问题

这类装置的典型解决方案是同时使用两个不同的烧瓶实例吗?例如,我的SocketIO服务器是否必须向我的REST API发出请求,以便检查特定用户是否已通过身份验证/授权连接到特定套接字?


Tags: 实例用户namefromimport服务器身份验证rest
1条回答
网友
1楼 · 发布于 2024-06-13 12:22:02

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

之所以有效,是因为在hood下,Flask SocketIO正在运行一个基于gevent的事件web服务器(或1.0版本,也包括eventlet)——该服务器直接处理websocket请求(使用通过socketio.on装饰器注册的处理程序),并将非websocket请求传递给Flask。

代码不能工作的原因是app.runsocketio.run都是阻塞操作。无论哪个先运行的都是循环,等待连接,从不允许第二个启动。如果您真的需要在不同的端口上运行websocket连接,那么您需要在不同的进程上生成socketio或apprun调用。

相关问题 更多 >