私は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_json
URL は、次の方法で 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.