我正在尝试使用 Flask-SocketIO 将 websocket 功能添加到我的应用程序中。
我的应用程序架构是高度解耦的,因此我想使用一组不同的服务器来处理 websocket 的东西。但是,在我的测试中,我使用的是具有不同端口的同一台服务器。
当我尝试使用 JavaScript 连接时:
<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>
我得到错误:
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).
所以为了缓解这个问题,我做了一些 CORS 的东西并在这里添加了crossorigin
定义:http: //flask.pocoo.org/snippets/56/
我不会发布装饰器的代码,因为我没有从上面的网页上更改它。
然后在我的端点上,我使用了装饰器:
@app.route('/socket/')
@crossdomain(origin='http://dev.example.com:8000', headers='Content-Type')
def socket():
return render_template('socket.html')
我也试过:
@app.route('/socket/')
@crossdomain(origin='*', headers='Content-Type')
def socket():
return render_template('socket.html')
在加载 /socket/ 端点的 HTTP 响应标头中,我可以看到标头:
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
但我仍然收到 CORS 错误。有人有什么想法吗?:)