2012-07-05 89 views
0

我正在嘗試用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

回答

2

$.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

0

的問題是用JavaScript代碼..我可以使用它代替:

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

然而,這是工作,但它是錯的,肯定不聰明,因爲大量的數據處理導致頁面掛起(#result innerHtml更新48612次)。 所以我想使用一個webWorker來做到這一點,或者保存數據,而不是在html中顯示它。

感謝所有