Django中的JSONP装饰器
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
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,因此您应该捕获它