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
    });
};

コンソールにも "result" で識別されるタグにも出力は書き込まれません。

編集すると、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 に答える