我需要将我的python Flask Web应用程序与运行通过socketio通信的代码分开。我能够从外部python程序获取消息到Web,但是我无法从python程序检测到的Web事件中获取消息。实际上,我希望当用户按下网页上的按钮时,外部python代码可以向终端打印问候世界消息。在此html的控制台中,我肯定看到了“已按下按钮”。
<html>
<head>
<title>Listener</title>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.8/socket.io.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function() {
var socket = io.connect();
$('#mybutton').on('click', function() {
socket.emit('my event', 'yodle');
console.log('Button pressed');
});
});
</script>
<button id="mybutton">Push Me!</button>
</body>
</html>
这是我的基本Flask网络服务器代码,正在运行:
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'froggy'
app.debug = True
socketio = SocketIO(app, message_queue='redis://')
@app.route("/")
def index():
return render_template("index.html")
if __name__ == '__main__':
socketio.run(app, host='0.0.0.0')
这是我单独运行的程序,当按下按钮时,它不会在终端上打印任何内容:
from flask_socketio import SocketIO
socketio = SocketIO(message_queue='redis://', host='0.0.0.0')
def my_function_handler(data):
print("Hello World")
if __name__ == '__main__':
while True:
socketio.on_event('my event', my_function_handler)
有人可以指出我要去哪里了吗?提前非常感谢!
答案 0 :(得分:1)
您正在尝试执行不支持的操作。外部进程只能发出,它们不是收件人。如果需要在外部进程中进行发送和接收,则建议您将Socket.IO服务器完全移至该进程。
答案 1 :(得分:0)
显然,根据Miguel的回答,socketIO中不支持此行为,因此,如果有人感兴趣,我将发布针对该问题的特定解决方案。我花了很多时间在Google搜寻,堆栈溢出和掉进兔子洞中。我最终要做的是,当我已经在使用redis时,我只是使用它在进程之间传递消息。这种方法有很多缺点,但是很适合我的需求,所以这就是我所做的。对于index.html:
<html>
<head>
<title>Listener</title>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.8/socket.io.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function() {
var socket = io.connect();
$('#mybutton').on('click', function() {
socket.emit('button event');
});
});
</script>
<button id="mybutton">Push Me!</button>
</body>
</html>
服务器代码:
from flask import Flask, render_template
from flask_socketio import SocketIO
import redis
app = Flask(__name__)
app.config['SECRET_KEY'] = 'froggy'
app.debug = True
socketio = SocketIO(app, message_queue='redis://')
r = redis.Redis("localhost")
r.set('button', 'not pressed')
@app.route("/")
def index():
return render_template("index.html")
@socketio.on('button event')
def handleMessage():
r.set('button', 'pressed')
if __name__ == '__main__':
socketio.run(app, host='0.0.0.0')
单独的运行过程:
import redis
r = redis.Redis("localhost")
if __name__ == '__main__':
while True:
if r.get('button') == 'pressed':
print("Button pressed!")
r.set('button', 'not pressed')