【问题标题】:Usage custom namespace Flask Socket io gives an errors使用自定义命名空间 Flask Socket io 给出错误
【发布时间】:2019-09-28 11:23:04
【问题描述】:

几个月来,我已经在 Python 3 中使用了完美的 Flask-SocketIO 库。直到最后几天,一切都按预期进行。

一切正常,如果连接到 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)。

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

堆栈版本:

  • Python 3.7.2,
  • 烧瓶 1.0.2,
  • Flask-SocketIO 3.3.1,
  • socketio.min.js 1.3.5,
  • 谷歌浏览器 77.0.3865.90(64 位)

【问题讨论】:

    标签: python python-3.x flask socket.io flask-socketio


    【解决方案1】:

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

    【讨论】:

    • 我在文档中完全错过了这一点,我认为添加到文档示例中并解释路径和命名空间之间的差异会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多