给出以下示例,根据文档,这是一个非常简单的示例。使用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()
陈述了整个示例脚本。如果您设法使其正常运行,请发表评论。谢谢。
我的猜测是,这是由于现在已修补了标准库猴子,以便与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服务器。