使用自定义命名空间 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)。
可能我只是理解错了一个小细节。非常感谢您对这个问题的帮助。
堆栈版本:
- Python3.7.2,
- 烧瓶 1.0.2,
- Flask-SocketIO 3.3.1,
- socketio.min.js
1.3.5,
- Google Chrome 77.0.3865.90(64 位)
您混淆了 namespace
和 path
,它们是完全不同的东西。该路径是 Socket.IO 服务器正在侦听的端点 URL。命名空间是 Socket.IO 的一项协议功能,它允许将多个逻辑连接多路复用到单个物理连接中。
我已经使用完美的 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)。
可能我只是理解错了一个小细节。非常感谢您对这个问题的帮助。
堆栈版本:
- Python3.7.2,
- 烧瓶 1.0.2,
- Flask-SocketIO 3.3.1,
- socketio.min.js 1.3.5,
- Google Chrome 77.0.3865.90(64 位)
您混淆了 namespace
和 path
,它们是完全不同的东西。该路径是 Socket.IO 服务器正在侦听的端点 URL。命名空间是 Socket.IO 的一项协议功能,它允许将多个逻辑连接多路复用到单个物理连接中。