【问题标题】:Working with POSTed json objects in Django在 Django 中使用 POSTed json 对象
【发布时间】:2012-11-20 00:19:29
【问题描述】:

我试图弄清楚如何在 Django 中处理 POSTed json 对象。我正在向服务器发布一个 json 对象,并希望像使用 python 字典一样使用它。

这是我的 js:

$.post(
        "/projects/vote/", 
        obj,
        function(data) {
            //alert("Data Loaded: " + data);
            alert(data["msg"]);
});

我要返回的内容(django 视图结束):

return HttpResponse(json.dumps(foo), mimetype="application/json")

在哪里

foo = {"msg": str(postdata)}

换句话说,我正在向服务器发布一个 json 对象,并提醒我在服务器上获取的 python 对象的字符串,以便我可以看到发生了什么。

如果我的 obj 是:

var obj = {
    'bulk': false,
    'data': {
          'chosen': '14',
          'proj1': '15',
          'proj2': '14',
          'proj3': '16',
          'more': false,


        },
    'data2': [
           {
               'a': 'apple'
           },
           {
               'b': 'banana'
           },
        ],      
  }

我得到这个作为回报:

<QueryDict: {u'data[proj3]': [u'16'], u'data[proj2]': [u'14'], u'data[chosen]': [u'14'], u'data[proj1]': [u'15'], u'bulk': [u'false'], u'data2[0][a]': [u'apple'], u'data[more]': [u'false'], u'data2[1][b]': [u'banana']}>

json obj 和 python dict 的结构怎么不对齐?以及如何使结构相同?例如而不是 data2[0][a],我将 data2 作为另一个字典的键

我如何获取 postdata:

# django version 1.4
postdata = request.POST.copy()

【问题讨论】:

    标签: javascript jquery python django json


    【解决方案1】:

    您可以像这样使用JSON.stringify 将json 发布为纯字符串:

        $.post(
                "/projects/vote/", 
                {msg: JSON.stringify(obj)},
                function(data) {
                    //alert("Data Loaded: " + data);
                    alert(data);
        });
    

    因此在服务器端,您应该只从request.POST 中提取'msg'

        def view(request):
              return HttpResponse(request.POST['msg'], mimetype="application/json")
    

    请注意,某些浏览器默认不支持JSON.stringify,您可能需要使用json lib:https://github.com/douglascrockford/JSON-js

    【讨论】:

      【解决方案2】:

      您没有展示如何从 POST 中获取 postdata,但您应该使用 request.body(在 1.4 之前的版本中为 request.raw_post_data)。

      【讨论】:

        【解决方案3】:

        您没有发布 JSON 数据。将dataType参数设置为json

        $.post(
                "/projects/vote/", 
                obj,
                function(data) {
                    //alert("Data Loaded: " + data);
                    alert(data["msg"]);
                },
                'json'
        );
        

        【讨论】:

          【解决方案4】:

          服务端可以简单的返回一个字符串,js可以这样写:

          $.post(
              "/projects/vote/", 
              obj,
              function(data) {
                  data=eval('(' + data+ ')');//get the json object from string.
                  //alert("Data Loaded: " + data);
                  alert(data["msg"]);
          });
          

          希望这有帮助。

          【讨论】:

            猜你喜欢
            • 2016-05-27
            • 1970-01-01
            • 2015-10-05
            • 1970-01-01
            • 2013-11-28
            相关资源
            最近更新 更多