Flask-SocketIO 实时显示 Ping 命令输出:使用 Eventlet 启用 WebSocket 连接
本教程将指导您如何使用 Flask-SocketIO 和 Eventlet 库,通过 WebSocket 连接实时显示 ping 命令的输出结果到网页上。
问题:
您可能会遇到 "The WebSocket transport is not available, you must install a WebSocket server that is compatible with your async mode to enable it." 的错误信息。这意味着您需要安装与您的异步模式兼容的 WebSocket 服务器来启用 WebSocket 传输。
解决方案:
您正在使用 Flask-SocketIO 库,它基于 Flask 和 SocketIO,可以帮助您实现 WebSocket 连接。为了启用 WebSocket 传输,您需要在您的代码中添加异步模式。
步骤:
-
安装 Eventlet 库:
pip install eventlet -
修改代码:
将
socketio = SocketIO(app)修改为socketio = SocketIO(app, async_mode='eventlet'),添加async_mode参数来指定使用 Eventlet 作为异步模式。import subprocess from flask import Flask, render_template, request, jsonify, make_response from flask_socketio import SocketIO, emit app = Flask(__name__, template_folder='C:\Users\zh\PycharmProjects\webping\') socketio = SocketIO(app, async_mode='eventlet') # 添加 async_mode 参数 process = None @app.route('/') def index(): return render_template('index.html') @app.route('/execute', methods=['POST']) def execute(): global process if request.form['action'] == 'start': if process is not None and process.poll() is None: return jsonify({'output': '进程正在运行,请先停止'}) process = subprocess.Popen(['ping', '1.1.1.1', '-t'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: output = process.stdout.readline() if output == b'' and process.poll() is not None: break if output: output_text = output.decode('gbk').strip() emit('ping_output', {'output': output_text}) return jsonify({'output': '命令已执行'}) elif request.form['action'] == 'stop': if process is not None and process.poll() is None: process.terminate() process.wait() process = None return jsonify({'output': '进程已停止'}) else: return make_response(jsonify({'error': '无效的动作'}), 400) if __name__ == '__main__': socketio.run(app, debug=True)
现在,您可以运行您的应用程序并使用 WebSocket 连接来实时显示 ping 命令的输出。
注意:
- 确保您已经安装了
eventlet库。 - 您的
index.html文件应该包含用于连接 WebSocket 的代码。 - 您可能需要调整
decode('gbk')部分,以匹配您的系统编码。
原文地址: https://www.cveoy.top/t/topic/qyxw 著作权归作者所有。请勿转载和采集!