2017-11-04 88 views
0

我试图创建一个应用程序,通过python flask-socketio包使用SocketIO。我已经建立了我的服务器,例如:Flask开发服务器服务损坏的socket.io.js文件

文件./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 127.0.0.1:5000/socket.io/socket.io.js通过卷曲检索了该文件,该命令返回了完全相同的乱码字符串。

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

我能做些什么来解决为什么我的服务器服务了一个明显损坏的socket.io文件?

回答

2

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

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

+0

我看到问题现在在哪里。我一直在关注官方SocketIO [开始](https://socket.io/get-started/chat/)文档,它说在客户端使用这个魔术路径字符串(在[这个SO问题](https://stackoverflow.com/questions/26480991/how-nodejs-and-socket-io-serve-socket-io-js?rq=1))。直到现在,我甚至都没有想到,神奇的路径可能只存在于官方的服务器端node.js包,而不是你的python绑定。我担心我的安装有些东西坏了。尽管如此,我还是觉得很奇怪,我并没有得到404。 –

+0

是的,Python服务器实际上不是绑定,它是一个与Node.js官方实现不共享代码的完整服务器。我想我可以改进URL的解析并返回404,但现在任何以'/ socket.io /'开头的东西都被假定为服务的轮询/ websocket端点。 – Miguel