Использование собственного пространства имен Flask Socket io выдает ошибку - PullRequest
0 голосов
/ 28 сентября 2019

Я пару месяцев использовал идеальную библиотеку Flask-SocketIO с Python 3.До последней пары дней все работало как положено.

Все работает нормально, если пространство имен для подключения к серверу websocket остается по умолчанию /socket.io.Но сейчас я получаю сообщение об ошибке, если пытаюсь изменить пространство имен для подключения к бэкэнду python flask-socketio.Мой app.py :

from flask import Flask, session, request, render_template, copy_current_request_context
from flask_cors import CORS, cross_origin
import flask_socketio as socketio
import ujson

async_mode = 'threading'
namespace = '/mynamespace'

app = Flask(__name__)
CORS(app)
app.config['SECRET_KEY'] = 'secret!'
sio = socketio.SocketIO(app, async_mode=async_mode)

@sio.on('connect', namespace=namespace)
def connect():
    logging.info('Connected')


@sio.on('disconnect', namespace=namespace)
def disconnect():
    logging.info('Disconnected')

@app.route("/home/index")
def home():
    return render_template('index.html',
            async_mode=sio.async_mode)

Я использую ./main.py для запуска сервера, main.py содержит:

from app import app, sio

if __name__ == "__main__":
    sio.run(app, debug=False)

My template/index.html содержит тонну кода js, но я думаю, что наиболее ценным я загружаю socketio из cdn в голову:

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>

... и использую соединение с пользовательским путем к пространству имен, как вdocs:

    namespace = '/mynamespace/socket.io';

    var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port, 
                            {path: namespace});

    socket.on('connect', function() {
        socket.emit('Connected to server');
    })

Как я понимаю, по умолчанию библиотека socketio пытается подключиться к бэкэнду с отправкой connect сообщения в пространство имен.Во время загрузки шаблона «index.html» по маршруту «/ home / index» регистрация ошибок в консоли:

Error on 'connect' to flask-socketio backend

Сервер Flask также выдает и 404ошибка:

Flask backend logs

Мое лучшее предположение: в данный момент похоже, что что-то изменилось в JS-библиотеке на стороне клиента или в самом браузере Chrome (несколько дней назад)Я обновил Chrome).

Возможно, я просто неправильно понял одну маленькую деталь.Я очень признателен за помощь в решении этой проблемы.

Версии стека:

  • Python 3.7.2,
  • Flask 1.0.2,
  • Flask-SocketIO 3.3.1,
  • socketio.min.js 1.3.5,
  • Google Chrome 77.0.3865.90 (64 бита)

1 Ответ

1 голос
/ 30 сентября 2019

Вы путаете namespace с path, что совершенно разные вещи.Путь - это URL-адрес конечной точки, где слушает сервер Socket.IO.Пространство имен - это функция протокола Socket.IO, которая позволяет мультиплексировать несколько логических соединений в одно физическое соединение.

...