¿Dónde está el lugar correcto para habilitar CORS?

Estoy usando Spyne (el ejemplo del código “hola mundo” ) para hacer un servicio web que produce algunos datos json y luego estoy tratando de consumir estos datos en código javascript en el navegador del cliente.

Cuando voy a la dirección http://localhost:8000/say_hello?name=Dave&times=3 , obtengo el siguiente resultado:

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

Por eso creo que no hay nada que hacer con el servidor (funciona como se esperaba).

Utilizo el siguiente código para obtener los datos de este servicio web:

            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"); }, });    

    Entonces me sale la ventana emergente “fail”.

    Mientras buscaba en la red, todo lo que podía encontrar era una configuración que debía realizarse en el lado del servidor de la siguiente manera:

     Add following header in the server: Header set Access-Control-Allow-Origin * 
    1. Si se debe cambiar alguna configuración de encabezado en el lado del servidor, ¿cómo puedo hacer eso?
    2. Si no es necesario cambiar la configuración del lado del servidor, ¿cuál debería ser el código del lado del cliente correcto?

    EDITAR

    Aquí está la última versión de python y código javascript:

    HTML:

            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"); }, });    

    Pitón:

     #!/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() 

    Necesita agregar esto como la primera línea de la implementación de su servicio:

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

    Sin embargo, eso puede ser muy molesto muy rápido, así que aquí hay una manera de implementarlo correctamente:

     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) 

    Entonces, en lugar de usar ServiceBase , ahora puede usar CorsService como clase principal para sus servicios para obtener el encabezado CORS automáticamente.

    También tenga en cuenta que es más seguro establecer el valor del encabezado solo en el dominio que aloja el servicio Spyne en lugar de usar un comodín.

    No es necesario agregar ningún código del lado del cliente.

    Simplemente debe agregar lo siguiente al encabezado de la respuesta enviada por el servidor:

    Acceso-Control-Permitir-Origen: *

    Consulte http://enable-cors.org/server.html para obtener más información sobre las diversas configuraciones del servidor. No estoy familiarizado con Spyne pero esto puede ayudar

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