flask_socketio使用任何message_queue作为SocketIO参数挂起

问题描述 投票:0回答:1

给出以下示例,根据文档,这是一个非常简单的示例。使用redis或任何其他提供程序作为message_queue时出现错误。浏览器只是挂起,尽管如果我只是将message_queue设置为None(取消注释该行)。一切正常。另外,我确实在环境上安装了kombu,redis和eventlet软件包pip。使用flask-socketio == 4.2.1

from flask import Flask, jsonify
from flask_socketio import SocketIO, emit


message_queue = "redis://127.0.0.1:6379"
# message_queue = None


app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app,
                    async_mode='eventlet',
                    message_queue=message_queue,
                    manage_session=False,
                    logger=True,
                    engineio_logger=True)


@app.route('/')
def home():
    return """
        <html>
        <body>
        <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
        <script type="text/javascript" charset="utf-8">
        var socket = io();
        socket.on('connect', function() {
            socket.emit('my event', {data: 'Im connected!'});
        });

        socket.on('my response', function(data) {
            console.log(data);
        });
        </script>
        ok
        </body>
        </html>
    """

@socketio.on('my event')
def test_message(message):
    emit('my response', {'data': 'got it!'})

这就是记录的内容:

Server initialized for eventlet.
 * Restarting with fsevents reloader
Server initialized for eventlet.
 * Debugger is active!
 * Debugger PIN: 609-071-851
(70237) wsgi starting up on http://127.0.0.1:5000
(70237) accepted ('127.0.0.1', 53303)
39982ab1b7f84dee8e8d34dee1141cec: Sending packet OPEN data {'sid': '39982ab1b7f84dee8e8d34dee1141cec', 'upgrades': ['websocket'], 'pingTimeout': 60000, 'pingInterval': 25000}

使用rabbit-mq,我从兔子那里得到了thouse日志:

rabbit_1         | 2020-02-18 20:47:16.535 [info] <0.18859.0> accepting AMQP connection <0.18859.0> (172.31.0.1:46412 -> 172.31.0.6:5672)
rabbit_1         | 2020-02-18 20:47:16.581 [info] <0.18859.0> connection <0.18859.0> (172.31.0.1:46412 -> 172.31.0.6:5672): user 'rabbitmq' authenticated and granted access to vhost '/'

===更新

在文件的开头修补事件,未更改行为。

import eventlet
eventlet.monkey_patch()

陈述了整个示例脚本。如果您设法使其正常运行,请发表评论。谢谢。

flask flask-socketio
1个回答
0
投票

我的猜测是,这是由于现在已修补了标准库猴子,以便与eventlet兼容。在脚本的两个处添加以下两行:

import eventlet
eventlet.monkey_patch()

from flask import Flask, jsonify
from flask_socketio import SocketIO, emit


message_queue = "redis://127.0.0.1:6379"
# message_queue = None

# ...

有关猴子修补的更多信息,请参见https://eventlet.net/doc/patching.html。>>

我还需要在底部添加run()调用,您在清单中省略了它:

socketio.run(app)

通过这两个更改,我可以运行Python脚本,而没有任何挂起的事情。我怀疑您可能一直在使用flask run运行服务器,但这不是启动eventlet服务器的方法,仅适用于Flask dev服务器。您必须使用socketio.run(app)才能正确启动eventlet服务器。

© www.soinside.com 2019 - 2024. All rights reserved.