the resource requested present origin has framework control been allow django extjs cors django-rest-framework django-cors-headers

resource - Aplicación ExtJS 5+error CORS de marco de reposo de Django al cambiar la URL de la tienda



has been blocked by cors policy django (1)

Estoy desarrollando una aplicación ExtJS que utiliza un servicio Django-rest-framework. Estoy usando encabezados CORS para permitir recuperar los datos del servicio ( https://github.com/OttoYiu/django-cors-headers ).

Lo que sucede es que en un momento dado quiero cambiar la URL de la tienda. Y cuando lo hago, recibo el siguiente error:

XMLHttpRequest cannot load http://10.98.0.241:8000/reacsearch/as?_dc=1418831884352&page=1&start=0&limit=25. The request was redirected to ''http://10.98.0.241:8000/reacsearch/as/?_dc=1418831884352&page=1&start=0&limit=25'', which is disallowed for cross-origin requests that require preflight.

En settings.oy defino las siguientes propiedades para CORS

CORS_ALLOW_METHODS = ( ''GET'', ''OPTIONS'' ) CORS_ORIGIN_ALLOW_ALL = True

Esto funciona bien cuando uso URLs para enumerar todos los elementos en mi base de datos, sin embargo, cuando cambio la tienda por otra URL obtengo el error anterior. Además, el enlace funciona bien en el navegador.

El cambio de URL de la tienda se realiza de esta manera:

var store = Ext.getStore(storeName); store.getProxy().setUrl(newURL); store.load();

La diferencia entre las vistas es que las dos que funcionan en la aplicación son conjuntos de vistas, mientras que la otra es solo una lista genérica

class Example1viewset(viewsets.ModelViewSet): """ API endpoing that allows metabolites to be viewed. """ queryset = examples1.objects.all() serializer_class = Example1Serializer class Example1SearchList(generics.ListAPIView): serializer_class = Example1Serializer def get_queryset(self): queryset = Example.objects.all() if ''attr'' in self.kwargs: queryset = queryset.filter(Q(attribute1__contains=self.kwargs[''attr'']) | Q(attribute2__contains=self.kwargs[''abbr''])) return queryset

Como mencioné, ambos ejemplos funcionan bien en el navegador (incluso accediendo a través de otras computadoras en la red), sin embargo, en la aplicación al cambiar la URL de la tienda recibo el error CORS. ¿Alguien tiene alguna idea de por qué está pasando esto?

Gracias.

Editar:

Solo por aclaración, el problema no está en cambiar la URL de la tienda. Como traté de establecer esas URL como valores predeterminados, pero no están funcionando cuando se accede desde la aplicación.

Mi archivo urls.py:

router = routers.DefaultRouter() router.register(r''example'', views.Example1ViewSet) # Wire up our API using automatic URL routing. # Additionally, we include login URLs for the browsable API. urlpatterns = [ url(r''^'', include(router.urls)), url(r''^reacsearch/(?P<attr>.+)/$'', Example1SearchList.as_view()), url(r''^api-auth/'', include(''rest_framework.urls'', namespace=''rest_framework''))

¿Puede ser que el problema esté relacionado con el hecho de que no estoy agregando la lista de búsqueda al enrutador?

Edit2

Problema resuelto ya que estaba tratando de obtener datos de un dominio diferente. Cambié el tipo de tienda a jsonp en Extjs, y también permití que mi servicio de descanso renderizara datos como jsonp.

Solo un recordatorio si alguien se encuentra con este mismo problema, es necesario agregar? Format = jsonp a la url de la tienda:

http://my/url/?format=jsonp


Dado que parece que se encontró una solución alternativa, explicaré cuál fue el problema y por qué funciona la alternativa.

XMLHttpRequest no puede cargar la first url . La solicitud se redirigió a '' second url '', que no está permitida para solicitudes de origen cruzado que requieren verificación previa.

El problema aquí es que le está diciendo a Django que aplique la barra al final, lo que lo hace redirigir direcciones URL automáticamente sin una barra al final con una barra al final, suponiendo que exista. Esta es la razón por la cual, como se indica en el error, la solicitud fue redirigida a la segunda url, que se puede decir que tiene la barra diagonal que falta. Esto está controlado por la configuración APPEND_SLASH Django que es True por defecto.

El problema es que cuando CORS realiza una solicitud de verificación previa, que es lo que le permite determinar si se puede realizar la solicitud, debe haber una respuesta válida en la URL solicitada . Debido a que está redireccionando la solicitud, la solicitud de verificación previa falla y queda bloqueado sin su información.

Puede solucionar esto agregando la barra final en su código. Parece que hay algunas soluciones para hacer esto con ext , pero personalmente no puedo recomendar uno específico. También puede establecer manualmente la url para usar la barra inclinada final, que suena como lo que estaba haciendo anteriormente.

O puedes usar JSONP ...

Has encontrado la solución alternativa, que es usar JSONP para realizar la solicitud en lugar de confiar en CORS. Esto evita el problema de verificación previa y funciona en todos los navegadores principales, pero hay algunos inconvenientes a tener en cuenta. Puede encontrar más información sobre CORS vs JSONP mirando a su alrededor.

Necesitará CORS si desea realizar algún cambio en su API, ya que JSONP solo admite solicitudes GET . Hay otras ventajas, como la posibilidad de cancelar solicitudes, que también viene con CORS.