Flask 套接字 IO 从另一个模块发出
Flask socket IO emit from another module
我几乎阅读了互联网上的每篇文章,但似乎没有一篇适合我的情况。我已经安装了 flask-socketio 并且一切正常,直到我从 app.py.
以外的模块发出消息
我已经尝试了几种方法来完成这个,我也通过使用 Redis 在文档中阅读了它,但它对我也不起作用。这是我的代码片段。
app.py
from flask import Flask
from flask import request
from flask_socketio import send, SocketIO, emit, join_room
app = Flask(__name__)
# This is to stop force sorting in response, by default jsonify sorts the response keys alphabetically
app.config["JSON_SORT_KEYS"] = False
socketio = SocketIO(app, cors_allowed_origins="*")
@socketio.on('join')
def client_join_room(data):
print(type(data))
room = data['room']
join_room(room)
send('you have entered the room.', room=room)
@app.route('/msg')
def send_message():
socketio.emit("message", "Server message", room='my_room')
return "I got you."
if __name__ == '__main__':
socketio.run(host="0.0.0.0", port=5001, debug=True, app=app)
my_module.py
def some_method():
import app
app.socketio.emit("message", "Some information about process", room='my_room', broadcast=True)
请注意,我在方法中导入了应用程序,因为 app.py
还导入了 my_module.py
我可以加入房间了。
当我调用 localhost:5001/msg 时它会发送到 'my_room'.
emit 在 my_module.py 内部不起作用,我不知道为什么。
我正在安慰从前端服务器获取的消息,因此我可以确定哪些消息已收到,哪些未收到。
另外,这里的 some_method()
是由来自 app.py 的 API 请求调用的。以防万一是否相关。
我已经设置了 logger=True,然后我在终端上为每个 emit 调用打印了这条消息。即使里面那个 some_method()
发射事件"message"到my_room[/]
这是否意味着消息确实已发送?如果是,那为什么我没有在前端的 jquery 中得到它。
这就是我在 html 页面
中所做的
$(document).ready(function () {
// start up the SocketIO connection to the server
var socket = io.connect('http://localhost:5001/');
// this is a callback that triggers when the "message" event is emitted by the server.
socket.on('message', function(msg){
console.log(msg)
});
socket.emit('join', {room: 'my_room'});
});
请尝试安装 Redis 和 eventlet 以进行异步调用并从其他模块发送消息。如 documentation 中所述,您可以将 app.py 中的行更改为
socketio = SocketIO(app, cors_allowed_origins="*", message_queue='redis://', async_mode='eventlet')
我几乎阅读了互联网上的每篇文章,但似乎没有一篇适合我的情况。我已经安装了 flask-socketio 并且一切正常,直到我从 app.py.
以外的模块发出消息我已经尝试了几种方法来完成这个,我也通过使用 Redis 在文档中阅读了它,但它对我也不起作用。这是我的代码片段。
app.py
from flask import Flask
from flask import request
from flask_socketio import send, SocketIO, emit, join_room
app = Flask(__name__)
# This is to stop force sorting in response, by default jsonify sorts the response keys alphabetically
app.config["JSON_SORT_KEYS"] = False
socketio = SocketIO(app, cors_allowed_origins="*")
@socketio.on('join')
def client_join_room(data):
print(type(data))
room = data['room']
join_room(room)
send('you have entered the room.', room=room)
@app.route('/msg')
def send_message():
socketio.emit("message", "Server message", room='my_room')
return "I got you."
if __name__ == '__main__':
socketio.run(host="0.0.0.0", port=5001, debug=True, app=app)
my_module.py
def some_method():
import app
app.socketio.emit("message", "Some information about process", room='my_room', broadcast=True)
请注意,我在方法中导入了应用程序,因为 app.py
还导入了 my_module.py
我可以加入房间了。
当我调用 localhost:5001/msg 时它会发送到 'my_room'.
emit 在 my_module.py 内部不起作用,我不知道为什么。
我正在安慰从前端服务器获取的消息,因此我可以确定哪些消息已收到,哪些未收到。
另外,这里的 some_method()
是由来自 app.py 的 API 请求调用的。以防万一是否相关。
我已经设置了 logger=True,然后我在终端上为每个 emit 调用打印了这条消息。即使里面那个 some_method()
发射事件"message"到my_room[/]
这是否意味着消息确实已发送?如果是,那为什么我没有在前端的 jquery 中得到它。
这就是我在 html 页面
中所做的$(document).ready(function () {
// start up the SocketIO connection to the server
var socket = io.connect('http://localhost:5001/');
// this is a callback that triggers when the "message" event is emitted by the server.
socket.on('message', function(msg){
console.log(msg)
});
socket.emit('join', {room: 'my_room'});
});
请尝试安装 Redis 和 eventlet 以进行异步调用并从其他模块发送消息。如 documentation 中所述,您可以将 app.py 中的行更改为
socketio = SocketIO(app, cors_allowed_origins="*", message_queue='redis://', async_mode='eventlet')