Pregunta

Estoy tratando de configurar el intercambio de recursos simple de origen cruzado con JQuery (1.7.1) Ajax alimentado en el cliente y Apache servido al servidor Python (Django). De acuerdo con todas las instrucciones que he leído, mis encabezados están configurados correctamente, pero sigo recibiendo el siguiente error:

XMLHTTTPRequest no puede cargar http://myexternaldomain.com/get_data . Origen http:// localhost: 8080 no está permitido por Acceso-Control-Permitir-Origen.

El encabezado que estoy tratando de haber intentado (no estoy seguro de que incluso está pasando el navegador) El envío es:

Request URL:http://myexternaldomain.com/get_data
Accept:application/json, text/javascript, */*; q=0.01
Origin:http://localhost:8080
Referer:http://localhost:8080/static/js/test-zetta.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11

El código JavaScript es

    var request = $.ajax({
        url : "http://myexternaldomain.com/get_data",
        type : "POST",
        dataType : "json",
        crossDomain : true
    });

Tenga en cuenta que origin está configurado correctamente. El servidor agrega el encabezado Access-Control-Allow-Origin = * mediante el siguiente código Python

def process_response(self, response):
    if response.has_header('Access-Control-Allow-Origin'):
            return response

    response['Access-Control-Allow-Origin'] = '*'
    return response

def get_orders(request):
    """ Tell worker what to do """
    response_data = {}
    response_data['action'] = 'probe'
    response = process_response(HttpResponse(json.dumps(response_data), mimetype="application/json"))
    return response

Si visito la dirección directamente, parece confirmar que el encabezado se está configurando correctamente

Access-Control-Allow-Origin:*
Content-Type:application/json
Date:Thu, 08 Mar 2012 05:06:25 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked

Sin embargo, en el ajuste de dominio cruzado, siempre falla (intentado tanto Chrome como Firefox). He intentado implementar el código exactamente según la respuesta seleccionada a esta pregunta , pero obtén el mismo error

actualización

Estoy bastante seguro de que el problema es el lado del servidor, ya que he logrado obtener mis llamadas AJAX trabajando con un servidor de CORS PUBLICO DIFERENTE PUBLICO. Cuando compare los encabezados que regresan de este servidor público, y los regresaron de la mía (cuando pruebo del mismo dominio), no puedo ver ninguna diferencia importante que pueda explicar la diferencia (ver más abajo).

Una sutileza que excluíé, lo que puede o puede ser importante es que el dominio real es un dominio de Amazon de varios subdominios. La real direccional es http: / /EC2-23-20-27-108.COMPUTE-1.AMAZONAWS.COM/GET_ORTERS , no dude en investigarlo para ver lo que estoy haciendo mal.

del servidor público

Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:622
Content-Type:text/html
Date:Thu, 08 Mar 2012 15:33:20 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:Perl/5.8.7, PHP/4.4.0

de mi servidor - (no funciona el dominio cruzado)

Access-Control-Allow-Origin:*
Content-Encoding:gzip
Content-Type:text/plain
Date:Thu, 08 Mar 2012 15:32:24 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding

¿Fue útil?

Solución

Así que estaba siendo engañado por la respuesta de ir a la URL, y de hecho, el problema era que al realizar la solicitud AJAX, estaba obteniendo un error 403 (solo revelado en Firefox no Chrome) debido a la protección de CSRF.

Otros consejos

Tiene que implementar una solicitud y respuesta "anticipada" antes de que su situación cuenta como " No tan simple ". Las cors básicas, que solo se requieren el encabezado de origen, solo pueden tener tipos de contenido de "Aplicación / X-WWW-Form-URLENCODED", "Multipart / Format-Data", y "Texto / Plain". Desde que regresa "Aplicación / JSON", no cumple con este requisito.

No sé nada sobre Django, pero me resultó más fácil implementar el soporte de CORS fuera de mi solicitud a través del uso de un Tomcat Filter . Parece que puedes hacer lo mismo con django.

2013-08-11: parece que el repo de GitHub ya no está con nosotros. Pero el paquete de Django parece estar disponible en https://pypi.python.org/ PYPI / DJANGO-CORS / 0.1

Estaba usando el excelente Django-CORS-HEADERS-HEADERS y corrió a este problematambién.Para mí, la solución fue agregar 'Aceptar-codificación' a la tupla de cors_allow_headers predeterminada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top