JSONP デコレーターを使用するapplication/json
と、パラメーターで定義された Javascript 関数として標準応答を返すことがcallback
できます。
この場合、JsonResponse (HttpResponse のサブクラス) を使用しており、このif
条件により、関数は JSONP 形式の応答ではなく元の応答を返します。simplejson
パーサーがオブジェクトと互換性がないためだと思いHttpResponse
ます。
問題は、どのように互換性を持たせるJsonResponse
かです。
JSON 応答https://www.domain.com/data.json
:
{"doc": "546546545", "order": "98745", "何もない": "0.0"}
JSONP 応答https://www.domain.com/data.json?callback=jQuery111305146260466426611_1448872734459
:
jQuery111305146260466426611_1448872734459({"doc": "546546545", "order": "98745", "nothing": "0.0"});
ビュー.py:
from django.http import JsonResponse
from collections import OrderedDict
from polls.jsonp_decorator import json_response
@json_response
def sampledata(request):
data = OrderedDict([('doc', '546546545'), ('order', '98745'), ('nothing', '0.0')])
return JsonResponse(data)
jsonp_decorator.py:
from django.http import HttpResponse
import simplejson
def json_response(func):
def decorator(request, *args, **kwargs):
objects = func(request, *args, **kwargs)
if isinstance(objects, HttpResponse): #here it returns objects
return objects
try:
data = simplejson.dumps(objects)
if 'callback' in request.REQUEST:
# A jsonp response!
data = '%s(%s);' % (request.REQUEST['callback'], data)
return HttpResponse(data, 'text/javascript; charset=utf-8')
except:
data = simplejson.dumps(str(objects))
return HttpResponse(data, 'application/json; charset=utf-8')
return decorator