2011-08-10 12 views
9

Tengo un servidor django dev ejecutándose en localhost: 8000 y un servidor nodejs en localhost: 3000. Quiero importar JSON en el servidor nodejs pero estoy recibiendo este error:django tastypie y dominio cruzado json

XMLHttpRequest cannot load http://127.0.0.1:8000/api/presentation/?format=json . Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin

Esta es mi primera incursión en la diversión de dominios cruzados así que estoy fuera de mi profundidad.

He agregado esto a mis rutas en el nodo (expressjs).

app.all('/', function(req, res){ 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "X-Requested-With"); 
    res.render('index', { 
    title: '...' 
    }); 
}); 

¿Qué estoy perdiendo/haciendo mal?

Respuesta

10

Los datos proveedor de necesita establecer una política para la solicitud de dominios (no el cliente , como sus fragmentos expressjs sugiere).

Someone registró una esencia con un simple middleware Django el cuidado de la inyección de las cabeceras necesarias:

Middlware to allow's your django server to respond appropriately to cross domain XHR (postMessage html5 API).

+0

funcionó! Muchas gracias: D –

+2

Estoy usando la esencia, pero no funciona para mí. Intenta cargar un json simple expuesto por backend django/python en lookback a través de un simple jquery. Estoy usando el método $ .getJSON también. Y también he agregado el mencionado middleware en mi configuración de middlewares. ¿Qué podría estar posiblemente mal? ¿Algún orden específico en el que se debe agregar middleware? ¿O necesito establecer explícitamente los encabezados en cada respuesta también?(Parece que no parece buscar el código de middleware). ¿O necesito modificarlo para que funcione con json mimetype? Gracias por adelantado. – sbidwai

+0

Creo que es necesario establecer encabezados tanto en la respuesta como en la solicitud. Esto se actualiza gist https://gist.github.com/1369619 –

1

Usted podría tener también utilizaron JSONP como

http://127.0.0.1:8000/api/presentation/?format=jsonp 
+1

¡Genial! Pero, ¿cómo puedo personalizar el nombre de devolución de llamada? – user507410

+0

incluyen el parámetro 'callback' en la URL. 'http: //127.0.0.1: 8000/api/presentation? format = jsonp & callback = foo'. – Jimothy

6

https://gist.github.com/426829 - Este fragmento fue realmente útil, pero haciendo POST usando backbone al servidor django tuve que hacer coincidir Access-Control-Request-Headers encabezado bajo pedido con Access-Control-Allow-Headers en respuesta.

café:

auth = (xhr) -> 
xhr['xhrFields']= {withCredentials: true} 
xhr.setRequestHeader('Access-Control-Allow-Credentials', 'true') 
xhr.header('Access-Control-Allow-Origin', "*") 
xhr.header('Access-Control-Allow-Methods', 'GET,POST,PUT,HEAD,DELETE,OPTIONS') 
xhr.header('Access-Control-Allow-Headers', 'Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control') 

pitón: https://gist.github.com/426829 con una línea adicional

def process_request(self, request): 

    if 'HTTP_ACCESS_CONTROL_REQUEST_METHOD' in request.META: 
     response = http.HttpResponse() 
     response['Access-Control-Allow-Origin'] = XS_SHARING_ALLOWED_ORIGINS 
     response['Access-Control-Allow-Methods'] = ",".join(XS_SHARING_ALLOWED_METHODS) 
     response['Access-Control-Allow-Headers'] = "Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control" 
     return response 

    return None   

Hope esto es útil!

+0

Esta respuesta necesita más votos. –

0

Configuración dataType: 'text' en lugar de 'jsonp' en el código ajax POST funcionó para mí.

1

This gist es una clase de base de recursos de TastyPie. Cualquier subclases de recursos será acceso a dominios cruzados.

Es similar a otros, pero agregará encabezados CORS a todos los responden a un recurso de TastyPie pueden dar. Esto incluye las respuestas de error y excepciones ImmediateHttpResponse

from tastypie.resources import Resource 
from tastypie.exceptions import ImmediateHttpResponse 
from django.http import HttpResponse 


class CorsResource(Resource): 

    """ adds CORS headers for cross-domain requests """ 

    def patch_response(self, response): 

     allowed_headers = ['Content-Type', 'Authorization'] 

     response['Access-Control-Allow-Origin'] = '*' 
     response['Access-Control-Allow-Headers'] = ','.join(allowed_headers) 
     return response 

    def dispatch(self, *args, **kwargs): 
     """ calls super and patches resonse headers 
      or 
      catches ImmediateHttpResponse, patches headers and re-raises 
     """ 

     try: 
      response = super(CorsResource, self).dispatch(*args, **kwargs) 
      return self.patch_response(response) 
     except ImmediateHttpResponse, e: 
      response = self.patch_response(e.response) 
      # re-raise - we could return a response but then anthing wrapping 
      # this and expecting an exception would be confused 
      raise ImmediateHttpResponse(response) 

    def method_check(self, request, allowed=None): 
     """ Handle OPTIONS requests """ 
     if request.method.upper() == 'OPTIONS': 

      if allowed is None: 
       allowed = [] 

      allows = ','.join([s.upper() for s in allowed]) 

      response = HttpResponse(allows) 
      response['Allow'] = allows 
      raise ImmediateHttpResponse(response=response) 

     return super(CorsResource, self).method_check(request, allowed) 
+0

Esto funcionó para mí. Simplemente cambié Resource a ModelResource en el encabezado de la clase. – PhoebeB

Cuestiones relacionadas