【问题标题】:Flask development server serving corrupted socket.io.js fileFlask 开发服务器服务损坏的 socket.io.js 文件
【发布时间】:2017-11-04 01:46:39
【问题描述】:

我正在尝试通过 python flask-socketio 包创建一个使用 SocketIO 的应用程序。我已经这样设置了我的服务器:

文件./run.py

from my_project import app, socketio

if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', debug=True)

文件./my_project/__init__.py

from flask import Flask
from flask_socketio import SocketIO

app = Flask(__name__)
app.config['SECRET_KEY'] = 'MY SECRET KEY'
socketio = SocketIO(app)

@socketio.on('connect')
def print_connect():
    print('Client connected')

@socketio.on('disconnect')
def print_disconnect():
    print('Client disconnected')

from my_project import views

尝试在客户端上使用它时遇到“未定义”错误,因此我打开了 Chrome 从服务器检索到的 socket.io.js 文件,但对以下内容(全部)感到惊讶:

�0{"pingTimeout":60000,"sid":"3d6073ff436c49b1aa06090dbb001ceb","upgrades":[],"pingInterval":25000}�40

为了仔细检查它是否与我的应用程序无关,我通过 curl 使用命令 curl 127.0.0.1:5000/socket.io/socket.io.js 检索了该文件,该命令返回了完全相同的乱码字符串。

我没有以任何方式使用 Express(据我所知),因此关于采购客户端 socket.io 文件的大多数其他问题似乎都不适用。此外,我没有从服务器收到 404,我收到的是 200 和 某种数据

我可以做些什么来解决为什么我的服务器正在提供一个明显损坏的 socket.io 文件?

【问题讨论】:

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


    【解决方案1】:

    Socket.IO JavaScript 客户端需要作为一个常规的静态文件。不知道为什么你期望 /socket.io/socket.io.js 路径会为客户端服务,它不是这样工作的,事实上,服务器与 JS 客户端无关。

    因此,您需要更改在<script> 标记中使用的URL 以指向实际的客户端库。例如,您可以从位于https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js 的 CDN 加载客户端,或者如果您愿意,可以下载此文件,将其放在应用程序的静态文件夹中,然后使用 url_for('static', filename='socket.io.js') 从那里加载。

    【讨论】:

    • 我知道问题出在哪里了。我一直在关注官方的 SocketIO get started 文档,其中说要在客户端上使用该魔术路径字符串(也在 this SO question 中进行了解释)。直到现在,我什至没有想到魔法路径可能只存在于官方服务器端 node.js 包中,而不存在于您的 python 绑定中。我担心我的安装有问题。不过,我仍然觉得很奇怪,我没有得到 404。
    • 是的,Python 服务器实际上不是绑定的,它是一个完整的服务器,与 Node.js 官方实现不共享任何代码。我想我可以改进 URL 的解析并在这种情况下返回 404,但现在任何以 /socket.io/ 开头的东西都被假定为服务的轮询/websocket 端点。