【问题标题】:Django - TypeError on deserializing json from jQuery POSTDjango - 从 jQuery POST 反序列化 json 的 TypeError
【发布时间】:2013-07-24 01:17:14
【问题描述】:

我通过 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_strategy 不参与simplejson 时,我得到

{
 "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 以更新现有的模型对象?

【问题讨论】:

  • strategy_update 是什么?
  • 一个错字,现已修正,并与我现有的代码仔细检查

标签: django json


【解决方案1】:

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

当它被 POST 到服务器时,有一个调用

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

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

我认为正在发生的事情是这样的:

  1. 在客户端,localTasks = {}
  2. 当发生.ajax 调用时,它不知道如何处理tasks 条目,因为.ajax 需要键/值对,因此它甚至不会将tasks 的内容发送到服务器.
  3. 服务器上的update_tasks = simplejson.loads(request.POST.get("tasks", False)) 代码尝试查找tasks,但tasks 不在request.POST 中,因此返回False
  4. JSON 解析器尝试执行 loads(False),导致您的错误。

要解决这些问题:

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

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2012-03-25
    • 2011-09-17
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多