Django中的JSONP装饰器

Django中的JSONP装饰器,django,python-3.x,jsonp,httpresponse,jsonresponse,Django,Python 3.x,Jsonp,Httpresponse,Jsonresponse,JSONP装饰器允许标准的application/json响应作为callback参数中定义的Javascript函数返回 在本例中,我使用的是JsonResponse(HttpResponse的子类),而if条件导致函数返回原始响应,而不是JSONP格式的响应。我想说这是因为simplejson解析器与HttpResponse对象不兼容 问题是如何使它与JsonResponse兼容 JSON响应https://www.domain.com/data.json: {“doc”:“54654654

JSONP装饰器允许标准的
application/json
响应作为
callback
参数中定义的Javascript函数返回

在本例中,我使用的是JsonResponse(HttpResponse的子类),而
if
条件导致函数返回原始响应,而不是JSONP格式的响应。我想说这是因为
simplejson
解析器与
HttpResponse
对象不兼容

问题是如何使它与
JsonResponse
兼容

JSON响应
https://www.domain.com/data.json

{“doc”:“546546545”,“order”:“98745”,“nothing”:“0.0”}

JSONP响应
https://www.domain.com/data.json?callback=jQuery111305146260466426611_1448872734459

JQUERY11130514626046426611_1448872734459({“doc”:“546546545”,“order”:“98745”,“nothing”:“0.0”})

views.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

这里有几个问题

首先,
isinstance
为子类返回true;因此,如果
objects
是JsonResponse,则
isinstance(objects,HttpResponse)
为真

其次,JsonResponse已经序列化为JSON;对它调用
simplejson.dumps()
是没有意义的。如果你想使用这个装饰器,你应该从view函数返回普通的dict

第三,你必须永远不要抓住一个赤裸的人。任何事情都可能出错,而您永远不会知道——因此您不确定此代码中的问题在哪里。只捕获您期望的异常;在本例中,如果某些内容不可序列化,则会引发TypeError,因此您应该捕获它