Где подходящее место для включения CORS?

Я использую Spyne (пример «hello world» code ), чтобы создать веб-сервис, который создает некоторые json данные, а затем я пытаюсь использовать эти данные в javascript-коде в браузере клиента.

Когда я http://localhost:8000/say_hello?name=Dave&times=3 на адрес http://localhost:8000/say_hello?name=Dave&times=3 Я получаю следующий вывод:

["Hello, Dave", "Hello, Dave", "Hello, Dave"]

Вот почему я думаю, что нет ничего общего с сервером (он работает так, как ожидалось).

Для получения данных из этого веб-сервиса я использую следующий код:

 <html> <head> <meta charset="utf-8"> </head> <body> <script src="jquery-1.11.1.min.js" ></script> <script> var request_url = 'http://localhost:8000/say_hello?name=Dave&times=3'; $.ajax( { type:'Get', url:request_url, dataType: "jsonp", crossDomain : true, success:function(data) { alert(data); }, error: function() { alert("fail"); }, }); </script> </body> </html> 

Затем я получаю всплывающее окно «fail».

Когда я искал сеть, все, что я мог найти, это настройка, которая будет выполняться на стороне сервера следующим образом:

 Add following header in the server: Header set Access-Control-Allow-Origin * 
  1. Если какой-либо параметр заголовка должен быть изменен на стороне сервера, как я могу это сделать?
  2. Если нет необходимости изменять настройки на стороне сервера, какой должен быть правильный код на стороне клиента?

РЕДАКТИРОВАТЬ

Вот последняя версия кода как python, так и javascript:

HTML:

 <html> <head> <meta charset="utf-8"> </head> <body> <script src="jquery-1.11.1.min.js" ></script> <script> var request_url = 'http://localhost:8000/say_hello?name=Dave&times=3'; var jdata = 'none' $.ajax( { type:'Get', url:request_url, dataType: "html", crossDomain : true, success:function(data) { alert(data); }, error: function() { alert("fail"); }, }); </script> </body> </html> 

Python:

 #!/usr/bin/env python # encoding: utf8 ''' This is a simple HelloWorld example to show the basics of writing a Http api using Spyne. Here's a sample: $ curl http://localhost:8000/say_hello?name=Dave\&times=3 ["Hello, Dave", "Hello, Dave", "Hello, Dave"] ''' import logging from spyne.application import Application from spyne.decorator import srpc from spyne.protocol.json import JsonDocument from spyne.protocol.http import HttpRpc from spyne.service import ServiceBase from spyne.model.complex import Iterable from spyne.model.primitive import UnsignedInteger from spyne.model.primitive import String from spyne.server.wsgi import WsgiApplication class CorsService(ServiceBase): origin = '*' def _on_method_return_object(ctx): ctx.transport.resp_headers['Access-Control-Allow-Origin'] = \ ctx.descriptor.service_class.origin CorsService.event_manager.add_listener('method_return_object', _on_method_return_object) class HelloWorldService(CorsService): @srpc(String, UnsignedInteger, _returns=Iterable(String)) def say_hello(name, times): for i in range(times): #yield '%s("Hello, %s")' % (callback, name) yield {"name": 'Hello (%d): %s' % (i, name), "address": "%d + %d" % (i, i)} if __name__=='__main__': from wsgiref.simple_server import make_server logging.basicConfig(level=logging.DEBUG) application = Application([HelloWorldService], 'spyne.examples.hello.http', in_protocol=HttpRpc(validator='soft'), out_protocol=JsonDocument(ignore_wrappers=True), ) wsgi_application = WsgiApplication(application) server = make_server('0.0.0.0', 8000, wsgi_application) logging.info("listening to http://127.0.0.1:8000") logging.info("wsdl is at: http://localhost:8000/?wsdl") server.serve_forever() 

Вам нужно добавить это как первую строку реализации вашей службы:

 ctx.transport.resp_headers['Access-Control-Allow-Origin'] = '*' 

Тем не менее, это может очень сильно раздражать, поэтому вот способ правильно его реализовать:

 class CorsService(ServiceBase): origin = '*' def _on_method_return_object(ctx): ctx.transport.resp_headers['Access-Control-Allow-Origin'] = \ ctx.descriptor.service_class.origin CorsService.event_manager.add_listener('method_return_object', _on_method_return_object) 

Поэтому вместо использования CorsService теперь вы можете использовать CorsService качестве родительского класса для своих сервисов, чтобы автоматически получать заголовок CORS.

Также обратите внимание, что более безопасно устанавливать значение заголовка только для домена, на котором размещена служба Spyne, вместо использования подстановочного знака.

Не нужно добавлять код на стороне клиента.

Вам просто нужно добавить в заголовок ответа, отправленного сервером, следующее:

Access-Control-Allow-Origin: *

Дополнительную информацию о различных настройках сервера см. В http://enable-cors.org/server.html . Не знаком со Spyne, но это может помочь

http://spyne.io/docs/2.10/manual/06_metadata.html#protocol-headers