无法通过django网络应用程序返回json响应

问题描述:

我正在尝试用django返回ajax请求的json响应。 Json响应是一个序列化的Python字典。我确信字典包含足够的数据,但它不会到达客户端。 服务器端我有这条巨蟒程序:无法通过django网络应用程序返回json响应

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是一个jQuery插件,做POST ajax请求,代码如下:

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

没有输出既没有写入控制台也没有用“结果”标识n标签。

编辑现在它返回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); 
     }); 

我萤火虫下进行测试,并响应到达客户端,但:1)的小阵列(1个元件)它在打印2)响应使我崩溃Chromium开发人员工具和Firebug(当打开JSON选项卡时,在响应选项卡中,我只获得一小段响应,并显示“Firebug响应大小限制已达到。”单击此处以打开整个响应新的Firefox标签“。

谢谢

+0

你确定你没有得到403 csrf缺少的答案,在该AJAX文章? – 2012-07-05 10:04:34

+0

我很确定我使用了csrf标记,如https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#csrf-ajax中所述.. 反正POST的返回代码是200 – gc5 2012-07-05 10:07:26

+0

您可以尝试在发送HttpResponse并在您的开发服务器中验证之前,在您的视图中打印JSON。 – Rohan 2012-07-05 10:08:08

$.postJSON是关于发布数据,这不是你在这里需要的,因为你显然没有发布任何东西(也不会处理在你的视图中发布的任何东西)。改用$.getJSON可能是第一件事(http://api.jquery.com/jQuery.getJSON/)。这也将避免与Django的CSRF令牌任何问题

+0

我同意你的观点,即使我有在这种情况下发布数据作为下一步。顺便说一下,用getJSON的结果是一样的。 – gc5 2012-07-05 10:15:33

+0

是一样的么?使用浏览器或curl/wget查询URL - 这会给你带来什么?它应该显示什么?在你的视图中放置一个打印语句来打印出返回的json对象 - 将它与你的客户端所看到的进行比较。如果没有发现问题,请编辑您的问题,以显示视图返回的数据与客户说它正在接收的数据相比较。 – scytale 2012-07-05 11:37:16

+0

谢谢@scytale ..我找到了解决方案。我通过wget获得json并将字典打印到服务器中的文件中,因为它们非常大(48612对 - 键/值),所以我不能在这里发布这些文件。但结果是: - 两个文件都包含所有键 - 有一个JavaScript代码的问题..我会在下面发布 – gc5 2012-07-05 13:13:24

的问题是用JavaScript代码..我可以使用它代替:

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

然而,这是工作,但它是错的,肯定不聪明,因为大量的数据处理导致页面挂起(#result innerHtml更新48612次)。 所以我想使用一个webWorker来做到这一点,或者保存数据,而不是在html中显示它。

感谢所有