Подтвердить что ты не робот

Access-Control-Allow-Origin в приложении Django при доступе через Phonegap

Я разрабатываю приложение Phonegap для своего приложения на основе Django, но при попытке сделать Ajax-вызовы я получаю эту ошибку:

XMLHttpRequest cannot load http://domain.herokuapp.com/getcsrf/?tags=jquery%2Cjavascript&tagmode=any&format=json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 

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

Здесь мой код Ajax:

get: function() {
    $.getJSON("http://domain.herokuapp.com/getcsrf/",
    {
        tags: "jquery,javascript",
        tagmode: "any",
        format: "json"
    },
    function(data) {
        $.each(data.items, function(item){
            console.log(item);
            });
    });
}
4b9b3361

Ответ 1

Django по умолчанию не предоставляет заголовки, необходимые для обеспечения перекрестного происхождения. Самый простой способ - просто использовать это приложение Django, которое обрабатывает его для вас: https://github.com/ottoyiu/django-cors-headers

Затем вы можете установить любые домены, которые вы хотите указать белым, используя настройки

CORS_ORIGIN_WHITELIST = (
    'google.com',
    'hostname.example.com'
)

чтобы поддерживать все, просто используйте настройки... CORS_ORIGIN_ALLOW_ALL = True а затем выполнить любую фильтрацию запроса в промежуточном программном обеспечении или в представлении.

Ответ 2

Для отдельных представлений вы можете вручную добавить заголовки:

@require_GET
def api_getto(request):
    response = JsonResponse(
        # your stuff here
    )
    response["Access-Control-Allow-Origin"] = "*"
    response["Access-Control-Allow-Methods"] = "GET, OPTIONS"
    response["Access-Control-Max-Age"] = "1000"
    response["Access-Control-Allow-Headers"] = "X-Requested-With, Content-Type"
    return response

Ответ 3

Вам нужно будет установить CORS в свой проект Django и убедиться, что вы не включили http://в строку для сайтов из белого списка.