0

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
4

1 に答える 1

2

ここにはいくつかの問題があります。

まず、isinstanceサブクラスに対して true を返します。がJsonResponseisinstance(objects, HttpResponse)の場合も同様です。objects

次に、JsonResponse はすでにJSON にシリアライズされています。それを呼び出す意味はありませんsimplejson.dumps()。このデコレーターを使用する場合は、view 関数からプレーンな dict を返す必要があります。

第三に、絶対に裸を捕まえてはいけません。何かがうまくいかない可能性があり、それを知ることはできません。したがって、このコードのどこに問題があるのか​​ 不明です. 予期している例外のみをキャッチします。この場合、シリアル化できないものがあると TypeError が発生するので、それをキャッチする必要があります。

于 2015-11-30T09:26:44.930 に答える