Azure Web App中Python Flask Websocket回退轮询的解决方法咨询
解决Azure Web App中Flask Websocket回退轮询及gevent-websocket服务器错误
问题根源
日志提示的错误说明当前运行的服务器不支持websocket,Azure Web App默认的Flask服务器无法处理websocket长连接,因此会回退到轮询模式。
解决步骤
1. 修改应用启动逻辑
必须将Flask应用绑定到gevent-websocket的WSGI服务器,替代默认服务器。示例代码如下:
import os from flask import Flask from gevent.pywsgi import WSGIServer from geventwebsocket.handler import WebSocketHandler app = Flask(__name__) # 此处添加你的websocket路由及业务逻辑 @app.route('/ws') def handle_websocket(): # 处理websocket连接的代码 pass if __name__ == '__main__': # 读取Azure环境变量中的端口,默认5000 port = int(os.environ.get('PORT', 5000)) # 启动支持websocket的服务器 server = WSGIServer(('0.0.0.0', port), app, handler_class=WebSocketHandler) server.serve_forever()
2. 配置Azure Web App启动命令
Azure Web App需要明确指定启动命令,确保使用我们修改后的启动脚本:
- 登录Azure门户,进入目标Web App
- 导航至「配置」→「常规设置」→「启动命令」
- 设置启动命令为
python app.py(替换为你的主文件名,比如main.py)
3. 确认运行时环境
- 在「配置」→「常规设置」中,确保Python版本设置为3.10,与应用依赖的版本一致
- 检查启动命令是否生效,避免被默认的自动启动逻辑覆盖
4. 验证依赖安装
通过Kudu控制台查看站点虚拟环境的依赖列表,确认gevent==22.10.2和gevent-websocket==0.10.1已成功安装。
补充说明
- 若使用Flask-SocketIO库,需额外指定异步模式为gevent:
from flask_socketio import SocketIO socketio = SocketIO(app, async_mode='gevent')
- Azure Web App免费层存在连接数限制,高并发websocket场景建议使用标准层及以上的服务计划。
内容的提问来源于stack exchange,提问作者user2467491
相关产品推荐
相关产品推荐

