如何从Django中输出JSON并使用来自跨域的jQuery调用它?
对于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); });
它在警报窗口中打印返回的数据,例如“最近上传标记的猫”。 但是,当我在服务器上尝试类似的代码时, 我根本得不到任何东西:
$.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检索它的建议方法是什么? 我上面的错误是什么?
这似乎工作(我忘了处理回调参数!):
服务器端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编码方面更成熟的方式)?
从Django 1.7开始,您可以简单地使用JsonResponse 。
>>> from django.http import JsonResponse >>> response = JsonResponse({'foo': 'bar'}) >>> response.content b'{"foo": "bar"}'