我尝试使用socketIO Flask应用程序连接我的角度应用程序,使用Grunt服务器运行时收到以下错误消息:
XMLHttpRequest cannot load http://localhost:8080/socket.io/1/?t=1381872821951.
Origin http://localhost:9000 is not allowed by Access-Control-Allow-Origin.
我一直在对这个问题进行一些挖掘,我知道这是因为客户端(angularjs)正在向响应来自的其他服务器发出请求。
这两个服务器中的哪个是问题?
1)Grunt服务器?我已经尝试过了:https://stackoverflow.com/a/17256255/1819058 如果来自Grunt服务器
,哪个应该解决问题2)Flask SocketIO服务器:
app = Flask(__name__)
@app.route("/socket.io/<path:path>")
def run_socketio(path):
socketio_manage(request.environ, {'': ChatNamespace})
if __name__ == '__main__':
print 'Listening on http://localhost:8080'
app.debug = True
import os
from werkzeug.wsgi import SharedDataMiddleware
app = SharedDataMiddleware(app, {
'/': os.path.join(os.path.dirname(__file__), 'static')
})
from socketio.server import SocketIOServer
SocketIOServer(('', 8080), app,
namespace="socket.io", policy_server=False).serve_forever()
这就是我连接服务器的方式:
var socket = ioSocket || io.connect('http://localhost:8080');
有人可以帮我这个吗?如果您使用websockets,请求是否会转到另一台服务器?
另一个奇怪的说法:整个过程有效但重启后停止工作......
答案 0 :(得分:1)
您需要分配自己的SocketIOHandler。首先,您需要在SocketIOServer中修复 init 。
class CorsServer(SocketIOServer):
def __init__(self, *args, **kwargs):
self.sockets = {}
if 'resource' in kwargs:
print "DEPRECATION WARNING: use `namespace` instead of `resource`"
self.namespace = kwargs.pop('resource', kwargs.pop('namespace',
'socket.io'))
self.transports = kwargs.pop('transports', None)
if kwargs.pop('policy_server', True):
self.policy_server = FlashPolicyServer()
else:
self.policy_server = None
#fix
if 'handler_class' not in kwargs:
kwargs['handler_class'] = SocketIOHandler
super(SocketIOServer, self).__init__(*args, **kwargs)
然后制作自己的SocketIOHandler
class CorsHandler(SocketIOHandler):
def write_plain_result(self, data):
self.start_response("200 OK", [
("Access-Control-Allow-Origin", self.environ.get('HTTP_ORIGIN', '*')),
("Access-Control-Allow-Credentials", "true"),
("Access-Control-Allow-Methods", "POST, GET, OPTIONS"),
("Access-Control-Max-Age", 3600),
("Content-Type", "text/plain"),
])
self.result = [data]
Init Flask,并添加路线
app = Flask(__name__)
@app.route("/socket.io/<path:path>")
def run_socket(param):
socketio_manage(request.environ, {'': YourNamespace})
使用CorsHandler初始化您的CorsServer
if __name__ == "__main__":
server = CorsServer(('0.0.0.0', 8080), app,
namespace="socket.io",handler_class=CorsHandler).serve_forever()
答案 1 :(得分:0)
看一下这篇文章:http://flask.pocoo.org/snippets/56/
在这里,您将看到如何为Acces-Control-Allow-Origin
设置通配符