Джанго Вкусный пирог и кросс-домен JSON - PullRequest
9 голосов
/ 10 августа 2011

Получил сервер разработки django на локальном хосте: 8000 и сервер nodejs на локальном хосте: 3000.Я хочу импортировать json на сервер nodejs, но получаю эту ошибку:

XMLHttpRequest не может загрузить http://127.0.0.1:8000/api/presentation/?format=json. Источник http://localhost:3000 не разрешен Access-Control-Allow-Origin

Это мой первый набег на междоменную забаву, поэтому я ПУТЬ из глубины.

Я добавил это к своим маршрутам в узле (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: '...'
  });
});

Что я пропускаю / делаю неправильно?

Ответы [ 6 ]

10 голосов
/ 10 августа 2011

Поставщик данных должен установить политику для междоменного запроса ( не клиент , как предлагают ваши фрагменты expressjs).

Кто-то опубликовал суть с простым промежуточным программным обеспечением Django, заботящимся о введении необходимых заголовков:

Промежуточное программное обеспечение, позволяющее вашему серверу django соответствующим образом реагировать на междоменный XHR (postMessage html5 API).

6 голосов
/ 28 января 2013

https://gist.github.com/426829 - Этот фрагмент был действительно полезен, однако при выполнении POST с использованием магистрали к серверу django мне пришлось сопоставить заголовок Access-Control-Request-Headers по запросу с Access-Control -Allow-Headers в ответе.

кофе:

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')  

питон: https://gist.github.com/426829 с одной дополнительной строкой

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          

Надеюсь, это полезно!

1 голос
/ 15 апреля 2014

Для этого есть дружественный и настраиваемый модуль Django: django-cors-headers

1 голос
/ 10 апреля 2014

Эта суть является базовым классом ресурса TastyPie.Любой ресурсный подкласс этого будет междоменный доступ.

Он похож на другие, но добавит заголовки CORS к всем ответам, которые может дать ресурс TastyPie.Это включает ответы об ошибках и исключения 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)
1 голос
/ 30 ноября 2011

Вы могли бы также использовать JSONP как

http://127.0.0.1:8000/api/presentation/?format=jsonp 
0 голосов
/ 05 декабря 2013

Настройка dataType: «text» вместо «jsonp» в коде ajax POST работала для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...