0

我正在尝试使用 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
    });
};

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

现在编辑它返回 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 选项卡中打开整个响应”。

谢谢

4

2 回答 2

2

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

于 2012-07-05T10:12:25.697 回答
0

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

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

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

谢谢大家

于 2012-07-05T13:20:58.290 回答