簡體   English   中英

Flask:一個RESTful API和SocketIO服務器

[英]Flask: A RESTful API and SocketIO Server

背景

我正在嘗試使用Flask-RESTful擴展創建一個簡單的REST API。 該API將主要用於管理CRUD和用戶認證以提供簡單服務。

我還嘗試使用Flask-SocketIO擴展創建一些Web套接字,這些用戶將能夠連接到這些套接字,並查看與使用該服務的其他人相關的某些數據的實時更新。 因此,我需要知道這些用戶已通過身份驗證並被授權連接到某些套接字。

問題

但是,我在設置時遇到了一些麻煩。 看來我無法在同一Flask實例上使這兩個組件(REST API和SocketIO服務器)一起工作。 我之所以這樣說,是因為當我運行以下命令時,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發出請求,以檢查特定用戶是否已通過身份驗證/授權連接到特定套接字?

您只想運行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調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM