代码之家  ›  专栏  ›  技术社区  ›  Emre Sevinç

如何从django中输出json并使用跨域的jquery调用它?

  •  2
  • Emre Sevinç  · 技术社区  · 14 年前

    对于bookmarklet项目,我尝试使用jquery从运行Django供电系统的服务器(自然是在不同的域上)获取JSON数据。

    根据jquery文档:“从jquery 1.2开始,如果您指定一个jsonp回调,就可以加载位于另一个域上的json数据,可以这样做:”myurl?回调=?”.jquery自动替换?使用要调用的正确方法名,调用指定的回调。“例如,我可以使用以下代码段在Firebug控制台中成功测试它:

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

    它在警报窗口中打印返回的数据,例如“最近上传的标记为cat”。但是,当我尝试使用类似的代码时 我的服务器 我什么都没有:

    $.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 回复  |  直到 9 年前
        1
  •  16
  •   Emre Sevinç    14 年前

    这似乎有效(我忘记处理回调参数!):

    服务器端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编码方面更成熟的方法)?

        2
  •  1
  •   Parag Tyagi    9 年前

    Django 1.7 以后,您只需使用 JsonResponse .

    >>> from django.http import JsonResponse
    >>> response = JsonResponse({'foo': 'bar'})
    >>> response.content
    b'{"foo": "bar"}'