flask_socketio висит, используя любой message_queue в качестве аргумента SocketIO - PullRequest
0 голосов
/ 18 февраля 2020

Учитывая следующий пример, это довольно простой пример согласно документации. У меня ошибка при использовании redis или любого другого провайдера в качестве message_queue. Браузер просто зависает, хотя, если я просто установлю message_queue на None (раскомментируйте строку). Все работает как положено. Кроме того, у меня есть пакет пакетов kombu, redis и eventlet, установленный в среде. Используя 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 я получил от журнала кролика вот такие логи:

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()

Указан весь пример сценария. Если вам удастся заставить его работать должным образом, пожалуйста, оставьте комментарий. Спасибо.

1 Ответ

1 голос
/ 19 февраля 2020

Полагаю, это связано с тем, что теперь стандартная библиотека обезьян исправлена ​​для совместимости с 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 для запуска сервера, но это не способ запустить сервер событий, который работает только для сервера Flask dev. Вы должны использовать socketio.run(app), чтобы правильно запустить сервер событий.

...