• 关于ajax跨域操作的jquery, django实践 - [开发]

    2008-06-30

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://henrygame.blogbus.com/logs/23846208.html

    ajax应用的越来越广泛。以前我一直使用jquery的.post,和.get来做
    ajax操作,很方便。但是.post和.get是不支持跨域操作的,例如:
    在a.com通过他们调用b.com,会返回uri denied。今天要实现一个feature
    要ajax跨域操作,就研究了一下。

    jquery从1.2开始,.getJSON就支持跨域操作了。这个是官方给出的例子。
    http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback

    $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
            function(data){
              $.each(data.items, function(i,item){
                $("<img/>").attr("src", item.media.m).appendTo("#images");
                if ( i == 3 ) return false;
              });
    });

    这里的jsoncallback是一个jsonp的callback。不指定就是用?,jquery会自动
    把?替代。这个大家可能还不太理解,一会就明白了。

    我用django做web开发的framework。那么提供json数据的view func应该如何写呢?

    def api(request, id):
        try:
            info = Info.objects.get(id=id)

            data = {
                'name':info.name,
                'gendar':info.gendar,
            }
        except:
            status = {}

        callback = request.GET['callback']

        return HttpResponse('%s(%s)' % (callback, simplejson.dumps(status)))

    这里的callback就是一个jsonp的func名字,通常是jsonp1214803701549这样的串。
    HttpResponse的返回值一定是jsonp1214803701549({'name':xxx, 'gendar':xxxx})。
    因为这样才能回调到你的客户端的function。这个浪费了我不少时间。

    HTML端代码就更简单。

    $.getJSON("http://xxx.com?callback=?",
            function(data){
                alert(data.name);
            }
    });

    到此,ajax的跨域操作就完成了。网上关于这方面的资料不多,而且都不详细。
    上面是我用firebug跟踪HttpResponse,HttpRequest的参数的总结的。
    可能有理解不当,或者有更好的方法,欢迎大家一起交流。


    收藏到:Del.icio.us




    评论

  • 我想问一下,如果只是用pythos输出一个json数据格式,
    比如说,
    /json/id.json
    如果直接把想要输出的内容写到文件里,做为静态内容的话,
    $.getJSON(....)就会成功返回,
    而如果不用静态内容输出的话,$.getJSON(...)就什么都不返回,
    你知道是怎么回事吗?
    yanzixiangnande@gmail.com希望交流一下