[英]Gunicorn Flask Restful API and Flask-Socketio crashes when I bind a host and port to Gunicorn
[英]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.run
和socketio.run
都阻止了操作。 第一個運行的是循環播放,等待連接,決不允許第二個啟動。 如果確實需要在其他端口上運行Websocket連接,則需要在其他進程上生成socketio或應用程序run
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.