2017-11-04 7 views
0

Ich versuche, eine App zu erstellen, die SocketIO über das Python-Flask-socketio-Paket verwendet. Ich habe meinen Server als solche eingerichtet:Flask-Entwicklungsserver serviert beschädigte socket.io.js Datei

Datei ./run.py

from my_project import app, socketio 

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

Datei ./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 

Ich war immer "nicht definiert" Fehler bei dem Versuch, es auf dem Client zu verwenden, so dass ich öffnete die socket.io.js Datei, die Chrome vom Server abgerufen hatte, nur um durch den folgenden Inhalt (in ihrer Gesamtheit) überrascht zu werden:

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

Um zu überprüfen, dass es nichts mit meiner App zu tun hatte, holte ich die Datei durch curl mit dem Befehl curl 127.0.0.1:5000/socket.io/socket.io.js zurück, der genau die gleiche verstümmelte Zeichenfolge zurückgab.

Ich verwende Express in keiner Weise (soweit ich weiß), so dass die meisten anderen Fragen über die Beschaffung der Client-socket.io-Datei nicht zutreffen scheinen. Außerdem bekomme ich keine 404 vom Server, ich bekomme eine 200 und Daten irgendeiner Art.

Was kann ich tun, um zu beheben, warum mein Server eine offensichtlich beschädigte socket.io-Datei bereitstellt?

Antwort

2

Der Socket.IO-JavaScript-Client muss als reguläre statische Datei bereitgestellt werden. Nicht sicher, warum Sie erwartet haben, dass der /socket.io/socket.io.js Pfad dem Client dient, das ist nicht so, wie es funktioniert, und tatsächlich hat der Server wirklich nichts mit dem JS-Client zu tun.

Sie müssen also die URL ändern, die Sie im Tag <script> verwenden, um auf eine tatsächliche Clientbibliothek zu zeigen. Zum Beispiel können Sie den Client von einem CDN unter https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js laden, oder wenn Sie möchten, laden Sie diese Datei herunter, legen Sie sie im statischen Ordner Ihrer Anwendung ab und laden Sie sie von dort mit url_for('static', filename='socket.io.js').

+0

Ich sehe, wo das Problem jetzt ist. Ich habe die offizielle Dokumentation von SocketIO [get started] (https://socket.io/get-started/chat/) gelesen, in der es heißt, diese magische Pfadzeichenfolge auf dem Client zu verwenden (auch in [dieser SO-Frage erläutert] ] (https://stackoverflow.com/questions/26480991/how-nodejs-and-socket-io-serve-socket-io-js?rq=1)). Es ist mir bis jetzt noch nicht einmal in den Sinn gekommen, dass der magische Pfad nur für das offizielle serverseitige Paket node.js und nicht für Ihre Python-Bindungen existieren könnte. Ich habe mir Sorgen gemacht, dass etwas mit meiner Installation korrupt ist. Mir kommt immer noch komisch vor, dass ich nicht nur einen 404 bekommen habe. –

+0

Ja, der Python-Server ist eigentlich keine Bindungen, es ist ein voller Server, der keinen Code mit der offiziellen Node.js-Implementierung teilt. Ich denke, ich kann das Parsing der URL verbessern und eine 404 für diesen Fall zurückgeben, aber im Moment wird alles, was mit '/ socket.io /' beginnt, als der Abfragungs-/Websocket-Endpunkt für den Dienst angesehen. – Miguel

Verwandte Themen