我已经在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>
...,并且我使用带有自定义名称空间路径的connect,如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
消息。在“ / home / index”路由上加载“ index.html”模板时,将错误记录到控制台:
Flask服务器也给出了404错误:
[我的最佳猜测:此刻,客户端JS库或chrome浏览器本身似乎有所更改(几天前,我更新了Chrome)。
也许我只是错误地理解了一个小细节。我真的很感谢您为这个问题提供的帮助。
堆栈版本:
您将namespace
与path
混淆了,这是完全不同的事情。路径是Socket.IO服务器正在侦听的端点URL。命名空间是Socket.IO的协议功能,它允许将多个逻辑连接多路复用为一个物理连接。