Django - 从jQuery POST反序列化json的TypeError

时间:2013-07-24 01:17:14

标签: django json

我正在通过jQuery Ajax将大量数据推送到JSON形式的Django应用程序中。数据由服务器接收,但我无法解析它。

在我的观看文件中,我有

from django.http import HttpResponse
from django.utils import simplejson

def saveStrategy(request):
  if not request.user.is_authenticated:
    return HttpResponse(simplejson.dumps({"response" : "failure"}))
  else:

    #This section here throws a TypeError - Expected String or Buffer
    #update_tasks = simplejson.loads(request.POST.get("tasks", False))
    #update_strategy = simplejson.loads(request.POST.get("strategy", False))

    update_strategy = request.POST.get("strategy", False)
    update_tasks = request.POST.get("tasks", False)

    print update_strategy

    return HttpResponse(simplejson.dumps({"response" : "success"}))

的目的地
if (typeof currentTaskId !== "undefined") {
    $("#save_strategy_task").trigger("click");
    localTasks = JSON.stringify(tasks)
}
else
    localTasks = {};

.ajax({
    url : "saveStrategy/",
    type : "POST",
    data : {"strategy" : JSON.stringify(strategy), "tasks" : localTasks},
    dataType : "json",
    success : function(data) {
        if (data.response == "success")
            strategyDetailCloseHandler();
    }
});

现在,当update_strategysimplejson无关时,我得到了

{
 "title":"Title",
 "status":"pending",
 "strategy":"Strategy",
 "dueDate":"",
 "owner":"",
 "metrics":"test",
 "id":"3",
 "outcome":"Outcome1"
}

但是,如果我尝试

print update_strategy["id"]

我收到TypeError: string indices must be integers错误。

如何解析传入的JSON以更新现有的模型对象?

1 个答案:

答案 0 :(得分:2)

代码中存在许多与预期变量类型相关的问题。例如,在JavaScript代码段中,localTasks可以是JavaScript对象{},也可以是JSON.stringify(tasks)中的字符串。

当这是POST到服务器时,有一个电话

update_tasks = simplejson.loads(request.POST.get("tasks", False))

如果响应中不存在False,则有可能返回布尔值tasks

我认为发生的事情是:

  1. 在客户端上,localTasks = {}
  2. 发生.ajax来电时,它不知道如何处理tasks条目,因为.ajax期望键/值对,因此它甚至不均匀将tasks的内容发送到服务器。
  3. 服务器上的update_tasks = simplejson.loads(request.POST.get("tasks", False))代码尝试查找taskstasks不在request.POST中,因此会返回False
  4. JSON解析器尝试执行loads(False),导致您的错误。
  5. 解决这些问题:

    1. 始终在客户端上将localTasks转换为一致的类型。即确保已将其转换为字符串。
    2. 不要做request.POST.get('foo', False)。相反,执行request.POST.get('foo', '')并在返回空字符串时处理错误情况。