【问题标题】:Unable to return json response by django web applicationdjango Web 应用程序无法返回 json 响应
【发布时间】:2012-07-05 09:54:13
【问题描述】:

我正在尝试使用 django 为 ajax 请求返回 json 响应。 Json 响应是一个序列化的 python 字典。我确信字典包含足够的数据,但它没有到达客户端。 服务器端我有这个 python 例程:

def routine(request):
    response_dict = {}
    f = open("output.txt", "r")
    for line in f:
        line.strip('\n ')
        (key, val) = line.split('\t')
        if re.search("^[a-zA-Z][a-zA-Z0-9]*$", key) != None:
            if re.search("^[0-9]+$", val) != None:
                response_dict[key] = val
    f.close()
    json_response = json.dumps(response_dict)
    return HttpResponse(json_response, mimetype='application/json')

客户端我有这个 javascript+jQuery 例程(在下面编辑,查看那个版本):

$.postJSON('ajax/routine', '', function(data) 
      {
        console.debug(data);
        console.debug(data.result);
        $("#result").html(data.result);
      });

postJSON 是一个做 POST ajax 请求的 jQuery 插件,代码如下:

$.postJSON = function(url, data, callback) {
    return jQuery.ajax({
    'type': 'POST',
    'url': url,
    'contentType': 'application/json',
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback
    });
};

控制台和标有“结果”的标签中都没有输出。

Edit 现在它返回 200 Http 状态码和 124 作为 data.result 。在我调试的服务器中,json.dumps 可以完美运行。

Edit2 我已经编辑了我的 jQuery/javascript 代码:

$.postJSON('ajax/routine', '', function(data) 
      {
        array = {};
        for(key in data)
          {
            array = key + " " + data[key];
          }
        $("#result").html(array);
      });

我已经在 Firebug 下对其进行了测试,并且响应到达了客户端,但是:1)使用小数组(1 个元素)将其打印出来 2)响应使 Chromium 开发人员工具和 Firebug 崩溃(打开 JSON 选项卡时,作为响应选项卡我只收到一条响应和消息“已达到 Firebug 响应大小限制。单击此处在新的 Firefox 选项卡中打开整个响应”。

谢谢

【问题讨论】:

  • 你确定在那个 ajax 帖子中没有得到 403 csrf-missing 答案吗?
  • 我很确定我使用了 docs.djangoproject.com/en/1.3/ref/contrib/csrf/#csrf-ajax 中所述的 csrf 令牌 .. 无论如何 POST 的返回码是 200
  • 您可以尝试在发送 HttpResponse 之前在您的视图中打印 JSON 并在您的开发服务器中进行验证。
  • @Francesco 您是否尝试过 Firebug 或 Chrome 开发人员工具来查找您收到的响应请求的数据?
  • 在你的 JS 中,你想要 array 作为字符串还是字典类型?在 for 循环中分配给它看起来不像你想要的。

标签: jquery python ajax django json


【解决方案1】:

$.postJSON 是关于发布数据的,这不是您在这里需要的,因为您显然没有发布任何内容(也不处理您视图中发布的任何内容)。使用$.getJSON 可能是首先要做的事情(http://api.jquery.com/jQuery.getJSON/)。这也可以避免 django 的 csrf 令牌出现任何问题

【讨论】:

  • 我同意你的看法,即使在这种情况下我必须发布数据作为下一步。顺便说一句,用getJSON的结果是一样的..
  • 同什么?使用浏览器或 curl/wget 查询 URL - 这给了你什么?它应该显示什么?在您的视图中放置一条打印语句以打印出返回的 json 对象 - 将其与您的客户所看到的进行比较。如果这不能揭示问题,请编辑您的问题,将视图返回的数据与您的客户说它正在接收的数据进行比较。
  • 谢谢@scytale .. 我找到了解决方案。我通过 wget 获得了 json 并将字典打印到服务器中的文件中,我无法在此处发布这些文件,因为它们非常大(48612 对 - 键/值)。但是结果是: - 两个文件都包含所有键 - 有javascript代码有问题..我会在下面发帖
【解决方案2】:

问题出在 javascript 代码上。我可以改用这个:

$.postJSON('ajax/routine', '', function(data) 
      {
        for(key in data)
            $("#result").html($("#result").html() + " " + key + " " + data[key]);
      });

但是,这是可行的,但它是错误的,而且肯定不聪明,因为要处理的大量数据会导致页面挂起(#result innerHtml 更新了 48612 次)。 所以我正在考虑使用 webWorker 来执行此操作或保存数据而不是在 html 中显示它。

谢谢大家

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2021-10-18
    • 2017-08-31
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多