Saltar al contenido

Servidor Tornado: habilite las solicitudes CORS

Solución:

Falta el código antes del vuelo, el OPTIONS solicitud.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS:

El estándar de intercambio de recursos entre orígenes funciona agregando nuevos encabezados HTTP que permiten a los servidores describir el conjunto de orígenes a los que se les permite leer esa información mediante un navegador web. Además, para los métodos de solicitud HTTP que pueden causar efectos secundarios en los datos del usuario (en particular, para los métodos HTTP distintos de GET o para el uso de POST con ciertos tipos de MIME), la especificación exige que los navegadores realicen una “verificación previa” de la solicitud, solicitando métodos compatibles. desde el servidor con un método de solicitud HTTP OPTIONS, y luego, tras la “aprobación” del servidor, enviar la solicitud real con el método de solicitud HTTP real. Los servidores también pueden notificar a los clientes si las “credenciales” (incluidas las cookies y los datos de autenticación HTTP) deben enviarse con las solicitudes.

Para implementar el controlador de verificación previa, simplemente agregue el controlador de opciones con los mismos encabezados y sin cuerpo.

class BaseHandler(tornado.web.RequestHandler):

    def set_default_headers(self):
        print "setting headers!!!"
        self.set_header("Access-Control-Allow-Origin", "*")
        self.set_header("Access-Control-Allow-Headers", "x-requested-with")
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')

    def post(self):
        self.write('some post')

    def get(self):
        self.write('some get')

    def options(self):
        # no body
        self.set_status(204)
        self.finish()

editar

he añadido x-requested-with encabezado a la lista de permitidos. Y aquí hay una muestra simple de jquery:

 $.ajax({
   url: "http://some_tornado/api",
   type: "POST",
   crossDomain: true,
   data: 'some_data',
   success: function (response) {
     alert(response);
   },
   error: function (xhr, status) {
     alert("error");
   }
 });

Y un artículo realmente bueno sobre cors: http://dev.housetrip.com/2014/04/17/unleash-your-ajax-requests-with-cors/

La respuesta de kwarunek me llevó a la solución de mi problema con la solicitud PUT y DELETE. Lo único es que la solución es demasiado apropiada para el ejemplo con GET y POST. En este caso la línea

self.set_header("Access-Control-Allow-Origin", "*")

en realidad es suficiente (si el navegador no bloquea CORS antes que nada). Sin embargo, es más relevante para las solicitudes PUT y DELETE. Lo que sucede aquí en el nivel de la red puede ser un poco más complejo que en el caso GET / POST.

“Si la solicitud es una solicitud” no simple “, el navegador envía primero una solicitud OPTIONS de” verificación previa “sin datos, para verificar que el servidor aceptará la solicitud. Una solicitud no es simple cuando se usa un verbo HTTP que no sea OBTENER o PUBLICAR (por ejemplo, PONER, ELIMINAR) “. cf. solicitudes no simples

class BaseHandler(tornado.web.RequestHandler):

    def set_default_headers(self):
        print("setting headers!!!")
        self.set_header("Access-Control-Allow-Origin", "*")
        self.set_header("Access-Control-Allow-Headers", "x-requested-with")
        self.set_header('Access-Control-Allow-Methods', ' PUT, DELETE, OPTIONS')

    def options(self):
        # no body
        self.set_status(204)
        self.finish()

Ahora todos los manejadores que heredan de BaseHandler son totalmente compatibles con CORS:

class MyHandler(BaseHandler):

    def put(self):
        self.write('some post')

    def delete(self):
        self.write('some get')

Incluso con las respuestas anteriores, todavía tengo el siguiente error CORS:

Solicitud de origen cruzado bloqueada: la política del mismo origen no permite leer el recurso remoto en http://127.0.0.1:9999/home?message=Input%20to%20API .. (Razón: falta el token ‘access-control-allow-origin ‘en el encabezado de CORS’ Access-Control-Allow-Headers ‘del canal de verificación previa de CORS).

y el solución es también permitir los encabezados:

class BaseHandler(tornado.web.RequestHandler):

    def set_default_headers(self):
        print("setting headers!!!")
        self.set_header("access-control-allow-origin", "*")
        self.set_header("Access-Control-Allow-Headers", "x-requested-with")
        self.set_header('Access-Control-Allow-Methods', 'GET, PUT, DELETE, OPTIONS')
        # HEADERS!
        self.set_header("Access-Control-Allow-Headers", "access-control-allow-origin,authorization,content-type") 

    def options(self):
        # no body
        self.set_status(204)
        self.finish()
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *