Flask socket IO 从另一个模块发出

Posted

技术标签:

【中文标题】Flask socket IO 从另一个模块发出【英文标题】:Flask socket IO emit from another module 【发布时间】:2020-04-06 18:23:48 【问题描述】:

我几乎阅读了互联网上的每一篇文章,但似乎对我的情况没有任何帮助。我已经安装了 flask-socketio 并且一切正常,直到我从 app.py 以外的模块发出消息。

我已经尝试了几种方法来实现这一点,并且我还通过使用 Redis 在文档中阅读了它,但它也对我不起作用。这是我拥有的代码 sn-ps。

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,因为 app.py 也导入了 my_module.py

    我可以加入房间。

    当我调用 localhost:5001/msg 时,它确实会发送到“my_room”。

    emit 在 my_module.py 中不起作用,我不知道为什么。

我正在整理从前端服务器收到的消息,因此我可以确定收到哪些消息,哪些没有收到。

另外,这里的some_method() 由app.py 的API 请求调用。以防万一。

我设置了 logger=True,然后每次发出调用都会在终端上打印此消息。即使在里面some_method()

将事件“消息”发送到 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');
    );

【问题讨论】:

您是否启用了登录客户端以查看是否收到消息?很明显,您的服务器日志记录似乎表明正在发送消息,对吗? 是的,我已经添加了在控制台中记录消息的客户端代码 我认为这必须做一些事情,因为烧瓶是一个阻塞事件,在请求完成之前不允许套接字发出消息。 @ManaliKagathara 我的意思是登录 Socket.IO 客户端,而不是您的应用程序。如果服务器发送了消息,那么客户端一定已经收到它并且出于某种原因决定不调用您的处理程序。 我在这里写的jquery代码是我现在在客户端的全部。我错过了一些明显的东西吗? @米格尔 【参考方案1】:

请尝试安装 Redis 和 eventlet 以进行异步调用并从其他模块发送消息。如documentation 中所述,您可以将 app.py 中的行更改为

socketio = SocketIO(app, cors_allowed_origins="*", message_queue='redis://', async_mode='eventlet')

【讨论】:

以上是关于Flask socket IO 从另一个模块发出的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 发出不接收消息的原因?

Socket.io 事件多次发出

从另一个文件访问SocketIO

在 Android 上发出 socket.io 消息

Flask socket.IO 服务器上的 Node.js Socket.io 客户端

socket.io 发出多次