0

私はjsonpで抱えている問題を解決しようとして、このサイトや他の場所を精査しました。まず、私が持っているコードは次のとおりです。

url =  "http://mydomain.com/return_json";

$.ajax({
    url: url, // + '?callback=?' --I realized this is not necessary with dataType: 'jsonp'
    dataType: 'jsonp',
    crossDomain: true,
    error: function(xhr, status, error) {
            console.log(xhr);
            console.log(status);
            console.log(error);
        },
    success: function(dataWeGotViaJsonp){
        var text = '';
        var len = dataWeGotViaJsonp.length;
        for(var i=0;i<len;i++){
            item = dataWeGotViaJsonp[i];
            text += '<p>' + item + '</p>';
        }
        $('#action_target').html(text);
    }
});

送信側の/return_jsonURL は、次の方法で json データを送信する Django サイトです。

def return_json(request):

    data = [{'testing': 'testing'}, {'one': 1, 'two': 2, 'three': 3}]

    return HttpResponse( json.dumps(data), content_type="application/javascript" )

JavaScript を見るとわかるように、エラーが発生すると、無差別にすべてをコンソールにダンプしています。その出力は次のとおりです。

Object { readyState=4, status=200, statusText="success"}
parsererror
Error: jQuery110207276483389928793_1377030169256 was not called

firebug の「ネット」領域は、URL が次のとおりであることを示しています。 http://mydomain.com/return_json? callback=jQuery110209170565296948737_1377029879665&_=1377029879666

また、有効な JSON が応答に含まれていることも示しています。きれいな出力を含む JSON セクションもあります。したがって、明らかに私の問題は、jQuery の自動生成されたコールバック関数が存在するが、呼び出されないことです。jsonp 用に設定された $.ajax および $.getJSON メソッドを使用しても同じ結果が得られます。この時点で私が考えることができる唯一のことは、送信者側でjsonデータを何らかの関数でラップすることになっているということですが、受信者がそれを処理するという印象を受けました。誰かが私が間違っていることを見ることができれば、それは大歓迎です。

================================完全な回答で更新============= ===========

ハミッシュは以下に正しい答えを持っていますが、2 つの微調整が必​​要なだけです。Django を使用して JSONP 形式でデータを送信する方法は次のとおりです。

def return_json(request):
#                      ^--------I didn't need a parameter in this situation
json_data = ["one", "two", "three"]

return render_to_response("uitest/jsonp_template.html", Context({
    'callback': request.GET.get('callback'),
    'json': mark_safe(json.dumps( json_data )),
#                ^------------------------------This keeps your JSON from getting mangled in 
#                                               URL                                                      
}), mimetype="application/javascript")
#^---------------------This closing parentheses was missing in Hamish's answer at the time
#                      of this writing.                                         
4

1 に答える 1

0

応答JSONPは、実際にはスクリプト応答です。次のようなものです。

callbackFunctionName([{'testing': 'testing'}, {'one': 1, 'two': 2, 'three': 3}]);

JSON の本体を唯一の引数とapplication/javascriptする function への関数呼び出しで応答を返すテンプレートを作成します。request.GET.get('callback')

何かのようなもの:

def return_jsonp(request, json_data)
    return render_to_response("jsonp_template.html", Context({
        'callback': request.GET.get('callback'),
        'json': json.dumps(json_data),
    }, mimetype="application/javascript")

どこjsonp_template.htmlにあるのですか:

{{ callback }}({{ json }});
于 2013-08-20T21:20:31.553 に答える