2013-10-15 1 views
0

Я получаю следующее сообщение об ошибке при попытке слишком подключить угловое приложение, запустите с сервером Grunt, с приложением socketIO Колбы:Acces-Control-Allow-Origin с Grunt сервером и Колбой SocketIO-приложением

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) Настой 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

Посмотрите на этот пост: http://flask.pocoo.org/snippets/56/

Здесь вы видите, как настроить подстановочные для Acces-Control- Allow-Origin

+0

Я попытался это. Я украсил маршрут @ app.route («/ socket.io/ ») с этим декоратором, но он не сработал. Означает ли это, что это приложение для флэшей, которое не позволяет CORS, а не сервер Grunt? – arnoutaertgeerts

+0

Grunt пытается соединиться с флеш-приложением, поэтому проблема в том, что приложение флэша не позволяет CORS –

1

Вам необходимо назначить собственный SocketIOHandler. Прежде всего вам нужно исправить init в SocketIOServer.

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 флягу, и добавить маршрут по

app = Flask(__name__) 
@app.route("/socket.io/<path:path>") 
def run_socket(param): 
    socketio_manage(request.environ, {'': YourNamespace}) 

Init вашего CorsServer с CorsHandler

if __name__ == "__main__":  
    server = CorsServer(('0.0.0.0', 8080), app, 
     namespace="socket.io",handler_class=CorsHandler).serve_forever() 
Смежные вопросы