【问题标题】:JSONP decorator in DjangoDjango 中的 JSONP 装饰器
【发布时间】:2015-11-30 09:12:56
【问题描述】:

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:

jQuery111305146260466426611_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

【问题讨论】:

    标签: django python-3.x jsonp httpresponse jsonresponse


    【解决方案1】:

    这里有几个问题。

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

    其次,JsonResponse已经序列化为 JSON;没有必要打电话给simplejson.dumps()。如果你想使用这个装饰器,你应该从视图函数中返回普通的 dict。

    第三,你必须永远不要抓到一个光秃秃的 except。任何事情都可能出错,而且您永远不会知道 - 因此您不确定此代码中的问题出在哪里。仅捕获您期望的异常;在这种情况下,如果某些内容不可序列化,则会引发 TypeError,因此您应该抓住它。

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 2010-10-27
      • 2015-01-18
      • 2012-03-20
      • 1970-01-01
      • 2019-10-23
      • 2013-07-24
      • 1970-01-01
      • 2018-10-18
      相关资源
      最近更新 更多