如何从Django中输出JSON并使用来自跨域的jQuery调用它?

Emr*_*inç 2 django jquery cross-domain

对于bookmarklet项目,我正在尝试使用运行Django驱动系统的服务器(当然是在不同的域上)使用jQuery来获取JSON数据.

根据jQuery文档:"从jQuery 1.2开始,如果你指定一个JSONP回调,你可以加载位于另一个域的JSON数据,这可以这样做:"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);
        });
Run Code Online (Sandbox Code Playgroud)

它在警报窗口中打印返回的数据,例如"最近上传标记的猫".但是,当我在服务器上尝试类似的代码时,什么都得不到:

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

没有警报窗口,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
Run Code Online (Sandbox Code Playgroud)

我也试过这个没有任何成功:

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")
Run Code Online (Sandbox Code Playgroud)

简而言之:从Django视图中返回一段数据并以跨域方式使用jQuery检索它的建议方法是什么?我上面的错误是什么?

Emr*_*inç 16

这似乎工作(我忘了处理回调参数!):

服务器端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")
Run Code Online (Sandbox Code Playgroud)

用于检索此数据的客户端jQuery代码:

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

有没有更好的方法来实现相同的效果(在Python和Django编码方面更成熟的方式)?