【问题标题】:Flask-SocketIO: Cannot connect to a namespaceFlask-SocketIO:无法连接到命名空间
【发布时间】:2021-04-06 05:26:42
【问题描述】:

我在使用 Flask-SocketIO 时通过 Websockets 连接到我的服务器时遇到问题。如果我不指定自定义命名空间,一切正常,但如果我想连接到命名空间,我无法连接。我做错了什么?

我做了一个小程序,显示了我的问题:

### removed to make the post less long, see below ###

我很确定我错误地连接了客户端。但我不知道如何正确地做到这一点。我查看了 SocketIO 客户端文档,但找不到帮助。

编辑:


为了更清楚,这里是一个只有一个套接字的更新版本:

from flask import Flask
from flask_socketio import SocketIO

app = Flask(__name__)
socketio = SocketIO(app)

@socketio.on("connect", namespace="/test")
def handle_connect():
   print("heureka!")
   return True

@app.route('/')
def index():
    return """
<!DOCTYPE HTML>
<html>
<head>
    <title>Flask-SocketIO Test</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.4/socket.io.js" integrity="sha512-aMGMvNYu8Ue4G+fHa359jcPb1u+ytAF+P2SCb+PxrjCdO3n3ZTxJ30zuH39rimUggmTwmh2u7wvQsDTHESnmfQ==" crossorigin="anonymous"></script>
    <script type="text/javascript" charset="utf-8">
        var socket1 = io("http://127.0.0.1:5000/test");
        socket1.on("connect", function() {
            console.log("yay!")
        });
    </script>
</head>
<body>
    Testing
</body>
</html>
"""

socketio.run(app, debug=True, log_output=True, use_reloader=False)

我可以在终端中看到套接字正在发送的请求:

(6548) wsgi starting up on http://127.0.0.1:5000
(6548) accepted ('127.0.0.1', 59354)
127.0.0.1 - - [30/Dec/2020 19:15:58] "GET / HTTP/1.1" 200 691 0.000000
127.0.0.1 - - [30/Dec/2020 19:15:58] "GET /socket.io/?EIO=4&transport=polling&t=NQqtHrO HTTP/1.1" 200 371 0.000997
127.0.0.1 - - [30/Dec/2020 19:15:59] "GET /socket.io/?EIO=4&transport=polling&t=NQqtI28 HTTP/1.1" 200 371 0.000997
127.0.0.1 - - [30/Dec/2020 19:16:00] "GET /socket.io/?EIO=4&transport=polling&t=NQqtILH HTTP/1.1" 200 371 0.000000
127.0.0.1 - - [30/Dec/2020 19:16:03] "GET /socket.io/?EIO=4&transport=polling&t=NQqtJ0u HTTP/1.1" 200 371 0.000996
127.0.0.1 - - [30/Dec/2020 19:16:08] "GET /socket.io/?EIO=4&transport=polling&t=NQqtKFD HTTP/1.1" 200 371 0.001002
127.0.0.1 - - [30/Dec/2020 19:16:13] "GET /socket.io/?EIO=4&transport=polling&t=NQqtLTa HTTP/1.1" 200 371 0.001024

【问题讨论】:

    标签: socket.io flask-socketio


    【解决方案1】:

    您使用的path 选项不是指定命名空间,它用于指示自定义Socket.IO 端点。一般不需要设置路径。

    命名空间在连接 URL 中给出:

    var socket1 = io("/test");
    

    或者,如果您更喜欢绝对 URL:

    var socket1 = io("http://localhost:5000/test");
    

    【讨论】:

    • 这是我的想法,但我也尝试过。您在示例中看到 socket2 是这样初始化的,但它也不起作用。顺便说一句,我也自己尝试了模型脚本中的每个选项。没有什么不同。
    • 有趣的是,我在终端上看到了套接字发送的请求,但从未调用过 handle_connect 函数。
    • 但是你改变了代码,你没有使用我给你的。您决定连接到 IP 地址 (http://127.0.0.1/test),而不是连接到相对命名空间 (/test) 或完整的主机名加命名空间 (http://localhost:5000/test),这是不同的并且会带来跨域问题。照我说的做,应该可以!
    • 对不起,我应该把你的例子放在问题中。但是,我再次尝试了这一切。跨域问题仅在我转到不同的 URL 时发生(这意味着如果尝试将套接字连接到 http://localhost:5000/test 我必须访问 http://localhost:5000。但如果我使用 http://127.0.0.1:5000http://127.0.0.1:5000/test 也可以。否则我会收到跨域错误)。我还尝试了相对 /testlocalhost:5000127.0.0.1:5000 都应该工作。两者都不起作用。一定有不同的错误。
    • 我刚刚建立了一个新环境并在那里进行了测试。有用。我不知道是什么在我的项目环境中破坏了它,但它与代码无关。我尝试在那里重新安装所有软件包。感谢您的努力,您尝试回答包裹上的每一个问题和问题的方式非常了不起。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多