使用Django回调的Javascript getJSON问题

时间:2010-12-23 22:33:06

标签: javascript jquery django getjson

我正在尝试使用此脚本进行调用,但我收到了“未捕获的SyntaxError:意外的令牌:

我无法弄清楚我哪里出错了,我不知道这是不是我的回调。我发送一个有效的JSON数据包,所以我不认为这是问题。无论如何,这是我的html / jquery调用:

<script>
function loadJSON(){
    $.getJSON("http://localhost:8000/api/0.1/tonight-mobile.json&callback=?", function(data){
            alert('hey');
             $('result').append(data);
             alert('hey 2'); 
         $.each(data, function(i, json){});

    });
    alert('hey 3');
}
</script>

在我的django视图中使用这个相应的功能:

def tonight_mobile(request):

    callback = request.GET.get('callback', '')

    def with_rank(rank, place):
        return (rank > 0)

    place_data = dict(
        Places = [make_mobile_place_dict(request, p) for p in Place.objects.all()]
    )

    xml_bytes = json.dumps(place_data)
    return HttpResponse(xml_bytes, content_type='application/json; charset=utf-8')

这是我的服务器记录的请求(因此我知道它至少可以通过OK状态代码获得这一点):

"GET /api/0.1/tonight-mobile.json&callback=jsonp1293142434434 HTTP/1.1" 200 167

在我的javascript控制台中显示此错误:

Uncaught SyntaxError: Unexpected token : tonight-mobile.json&callback=jsonp1293142434434:1

如果您需要查看我的JSON格式(如果这是造成这种情况的原因),请告诉我,我也可以发布。

提前感谢您的帮助!


更新

以下是来自我的服务器的响应:

{"Places": [{"url": "http://localhost:8000/api/0.1/places/1.plist", "image_url": "http://localhost:8000/static/place_logos/Tsonoqua_Mask.gif", "name": "Boo's Place"}]}
[23/Dec/2010 17:37:22] "GET /api/0.1/tonight-mobile.json&callback=jsonp1293147441552 HTTP/1.1" 200 167

更新2:

我设法使我的回调正常工作!这是代码:

客户方:

<script>
function loadJSON(){
    $.getJSON("http://localhost:8000/api/0.1/tonight-mobile.json&callback=?", logIt(data));
}
function logIt(data){
    window.console && console.log(data);
    alert('yay!');
}
</script>

服务器端:

def tonight_mobile(request):
    callback = request.GET.get('callback', 'logIt')

    def with_rank(rank, place):
        return (rank > 0)

    place_data = dict(
        Places = [make_mobile_place_dict(request, p) for p in Place.objects.all()]
    )

    xml_bytes = json.dumps(place_data)

    if callback:
        xml_bytes = '%s(%s)' % (callback, xml_bytes)
    print xml_bytes

    return HttpResponse(xml_bytes, content_type='application/javascript; charset=utf-8')

这将返回以下响应:

logIt({"Places": [{"url": "http://localhost:8000/api/0.1/places/1.plist", "image_url": "http://localhost:8000/static/place_logos/Tsonoqua_Mask.gif", "name": "Boo's Place"}]})

它应该如何运作?看来我应该能够简化getJSON调用...我只是想确保在继续解析响应并将它们设置为页面上的元素之前,我已经完成了我需要正确使用回调的所有内容。


更新3 *

所以,我取得了一些进步!我正在使用Jquery mobile,所以忽略以下一些过度的css,它与核心问题无关。

我在我的JSON数据包中的“Places”循环时出现问题。我得到了多个“地方”的回复,但似乎无法弄清楚如何迭代它们。我的每个循环中的'i'变量对第一个元素正常工作,并显示其相应的名称&amp;图像。

我的getJSON和回调方法已演变为:

<script>
function loadJSON(){
    $.getJSON("http://localhost:8000/api/0.1/tonight-mobile.json&callback=?", callback(data));
}
function callback(data){
    $("#tonight-list").each(data.Places, function(i) {
        $(this).append("<li role='option' tabindex='" + data.Places[i] + "' class='ui-li-has-thumb ui-li ui-btn ui-btn-icon-right ui-corner-top ui-corner-bottom ui-controlgroup-last ui-btn-down-c ui-btn-up-c' data-theme='c'><div class='ui-btn-inner ui-corner-top ui-corner-bottom ui-controlgroup-last'><span class='ui-icon ui-icon-arrow-r'></span><div class='ui-btn-text'><img src=" + data.Places[i].image_url + " alt=" + data.Places[i].name + " class='ui-li-thumb ui-corner-tl ui-corner-bl'/><h1 class='list-title ui-li-heading' id='list-title'><a href='detail.html?id=slide' data-transition='slide' class='ui-link-inherit'>" + data.Places[i].name + "</a></h1><span class='ui-li-count ui-btn-up-c ui-btn-corner-all'>" + data.Places[i].events + " events</span></div></div></li>");
    });

}
</script>

以下是我的回复:

callback({"Places": [{"url": "http://localhost:8000/api/0.1/places/3.plist", "image_url": "http://localhost:8000/static/place_logos/Bengals_1.png", "name": "Big 12", "events": 2}, {"url": "http://localhost:8000/api/0.1/places/2.plist", "image_url": "http://localhost:8000/static/place_logos/Makonde_Mask.gif", "name": "Harpo's", "events": 0}, {"url": "http://localhost:8000/api/0.1/places/1.plist", "image_url": "http://localhost:8000/static/place_logos/Quintons_1.png", "name": "Quinton's", "events": 1}]})

我是否混淆了每个函数如何迭代JSON(成为)Javascript对象?我很确定每个都是我的问题,因为我只获得了“地方”列表的第一个元素。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

是的,要返回jsonp,您需要将响应包装在函数中:

def tonight_mobile(request):

    callback = request.GET.get('callback')

    def with_rank(rank, place):
        return (rank > 0)

    place_data = dict(
        Places = [make_mobile_place_dict(request, p) for p in Place.objects.all()]
    )

    xml_bytes = json.dumps(place_data)
    if callback:
        xml_bytes = '%s(%s)' % (callback, xml_bytes)
    return HttpResponse(xml_bytes, content_type='application/json; charset=utf-8')

答案 1 :(得分:1)

看起来不错,您可以像这样简化getJSON调用:

function loadJSON(){
    var url = "http://localhost:8000/api/0.1/tonight-mobile.json&callback=?";
    $.getJSON(url, function(data){
        if(data){
            console.log(data.name);
        }
    });
}

在你的python代码中我会做

callback = request.GET.get('callback')

而不是

callback = request.GET.get('callback', 'logIt')

所以如果没有提供回调,将返回json而不是jsonp。

答案 2 :(得分:0)

你正在混合使用JSON和JSONP。你的Django脚本返回一个JSON对象,当jQuery期望一个用回调参数包装的JSON对象时:

callback(JSON string);