2015-09-14 2 views
2

J'essaie d'utiliser Flask-SocketIO pour ajouter une fonctionnalité websocket à mon application.Flask SocketIO - numéro CORS

Mon architecture d'application est fortement découplée et, par conséquent, je souhaite utiliser un ensemble de serveurs différent pour gérer le contenu de la socket Web. Cependant, dans mes tests, j'utilise le même serveur avec des ports différents.

Quand j'essayer de se connecter en JavaScript avec:

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script> 
<script type="text/javascript" charset="utf-8"> 
    var socket = io.connect("http://dev.example.com:8000"); 
    socket.on('connect', function() { 
     socket.emit('my event', {data: 'I\'m connected!'}); 
    }); 
</script> 

Je reçois l'erreur:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://dev.example.com:8000/socket.io/1/?t=1442224745873. (Reason: CORS request failed). 

Donc, pour atténuer ce risque, je l'ai fait quelques trucs CORS et a ajouté le crossorigin défini ici: http://flask.pocoo.org/snippets/56/

Je ne publierai pas le code pour le décorateur car je ne l'ai pas changé de ce qui est sur la page Web ci-dessus.

Et puis sur mon point final, je l'ai utilisé le décorateur:

@app.route('/socket/') 
@crossdomain(origin='http://dev.example.com:8000', headers='Content-Type') 
def socket(): 
    return render_template('socket.html') 

J'ai aussi essayé:

@app.route('/socket/') 
@crossdomain(origin='*', headers='Content-Type') 
def socket(): 
    return render_template('socket.html') 

Et dans les en-têtes de réponse HTTP de chargement de la/socket/point final Je peux voir les en-têtes:

Access-Control-Allow-Headers:Content-Type 
Access-Control-Allow-Methods:HEAD, OPTIONS, GET 
Access-Control-Allow-Origin:http://dev.example.com:8000 
Access-Control-Max-Age:21600 
Content-Length:448 
Content-Type:text/html; charset=utf-8 
Date:Mon, 14 Sep 2015 10:20:09 GMT 
Server:Werkzeug/0.10.4 Python/2.7.9 

Mais je reçois toujours l'erreur CORS. Quelqu'un a une idée? :)

+0

Dans l'en-tête Access-Control-Allow-Origin actuel, vous mettez le formulaire d'origine dans lequel la demande est faite, n'est-ce pas? Y compris le numéro de port réel. Parce que, comme indiqué dans votre fragment de code, l'origine que vous avez placée dans votre en-tête Access-Control-Allow-Origin est la même que l'origine du serveur lui-même auquel la requête est envoyée. Et ce serait faux. Parce qu'il doit être l'origine de l'autre serveur, le serveur demandeur. – sideshowbarker

Répondre

0

Il s'avère que je courais le serveur sur localhost par opposition à 0.0.0.0. Je ne sais pas pourquoi cela m'a donné une erreur CORS mais il a résolu le problème.