使用自定义命名空间 Flask Socket io 会报错

Usage custom namespace Flask Socket io gives an errors

我已经使用完美的 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)

我的 template/index.html 包含大量 js 代码,但我认为最有价值的是我在头上从 cdn 加载 socketio:

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

...我使用自定义命名空间路径连接,如文档中所示:

    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 消息来连接后端。在“/home/index”路由上加载 'index.html' 模板期间,将错误记录到控制台:

Flask 服务器也给出 404 错误:

我的最佳猜测:目前看来客户端 JS 库或 chrome 浏览器本身发生了一些变化(几天前我更新了 Chrome)。

可能我只是理解错了一个小细节。非常感谢您对这个问题的帮助。

堆栈版本:

您混淆了 namespacepath,它们是完全不同的东西。该路径是 Socket.IO 服务器正在侦听的端点 URL。命名空间是 Socket.IO 的一项协议功能,它允许将多个逻辑连接多路复用到单个物理连接中。