Как вывести JSON из Django и вызвать его с помощью jQuery из кросс-домена? - PullRequest
2 голосов
/ 30 апреля 2010

Для проекта букмарклета я пытаюсь получить данные JSON, используя jQuery, с моего сервера (который, естественно, находится в другом домене), работающего под управлением системы на основе Django.

Согласно документации jQuery: «Начиная с jQuery 1.2, вы можете загружать данные JSON, расположенные в другом домене, если вы укажете обратный вызов JSONP, что можно сделать так:« myurl? Callback =? ». JQuery автоматически заменяет? с правильным именем метода для вызова, вызывая указанный вами обратный вызов. " И, например, я могу успешно протестировать его в моей консоли Firebug, используя следующий фрагмент:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&    format=json&jsoncallback=?",
        function(data){
          alert(data.title);
        });

Печатает возвращенные данные в окне предупреждения, например, «Последние добавления с тегом кошка». Однако, когда я пытаюсь подобный код с моим сервером , я ничего не получаю вообще:

$.getJSON("http://mydjango.yafz.org/randomTest?jsoncallback=?",
        function(data){
          alert(data.title);
        });

Нет окон предупреждений, а в строке состояния Firebug написано «Передача данных с mydjango.yafz.org ...» и продолжает ждать. На стороне сервера у меня это:

def randomTest(request):
    somelist = ['title', 'This is a constant result']
    encoded = json.dumps(somelist)
    response = HttpResponse(encoded, mimetype = "application/json")
    return response

Я тоже пытался безуспешно:

def randomTest(request):
    if request.is_ajax() == True:
        req = {}
        req ['title'] = 'This is a constant result.'
        response = json.dumps(req)
        return HttpResponse(response, mimetype = "application/json")

Итак, вкратце: каков предлагаемый метод возврата части данных из представления Django и извлечения его с использованием jQuery в междоменной манере? Какие мои ошибки выше?

Ответы [ 2 ]

16 голосов
/ 30 апреля 2010

Это похоже на работу (я забыл обработать параметр обратного вызова!):

Серверный код Python / Django:

def randomTest(request):
    callback = request.GET.get('callback', '')
    req = {}
    req ['title'] = 'This is a constant result.'
    response = json.dumps(req)
    response = callback + '(' + response + ');'
    return HttpResponse(response, mimetype="application/json")

Код jQuery на стороне клиента для получения этих данных:

$.getJSON("http://mydjango.yafz.org/polls/randomTest?callback=?",
        function(data){
          alert(data.title);
        });

Есть ли лучший способ добиться того же эффекта (более устоявшийся способ с точки зрения кодирования на Python и Django)?

1 голос
/ 03 ноября 2015

С Django 1.7 и далее, вы можете просто использовать JsonResponse .

>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
b'{"foo": "bar"}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...