Django - 解析 JSONP(Json 带填充)

Django - Parse JSONP (Json with Padding)

我正在使用 JSONP 将数据从 otherdomain.com 发送到 mydomain.com

但是,当我尝试在 Django 控制器中解析 JSONP 数据时出错 (views.py)。

这是我的代码。


Javascript 在 mydomain.com 客户端页面

jsonData = {
    'foo': 'bar',
}

$.ajax({
    url: 'http://otherdomain.com/end_point/',
    type: 'GET',
    contentType: 'application/json; charset=utf-8',
    data: jsonData,
    dataType : 'jsonp',
    jsonp : 'callback'
});

mydomain.com

中的 Django 控制器(views.py
from django.http import JsonResponse
import json

def decode_jsonp(request):

    if 'callback' in request.GET:
        json_object = json.loads(request.body) # Raise error
        json_object = json.dumps(request.body) # Do not raise error but returns nothing
        json_object = json.loads(json.dumps(request.body)) # Raise error

        foo = json_object['foo']

    return JsonResponse({'foo': foo})

我不知道我应该用什么代替 json_object = json.loads(request.body)

A JSONP 对象周围有括号和回调。但是 Python 的 json 模块无法识别 JSONP 对象。因此,您必须首先通过删除周围的括号和回调名称将其转换为 JSON 对象。

例子

>>> data = 'callback({"key": "val"})' # a common JSONP object
>>>
>>> json.loads(data)
# raises ValueError
>>>
>>> data_json = data.split("(", 1)[1].strip(")") # convert to json
>>> data_json
'{"key": "val"}' 
>>>
>>> json.loads(data_json)
# success

感谢@xyres。这是解决方案。

def decode_jsonp(request):

    if 'callback' in request.GET:
        query_string = request.GET.urlencode()
        json_object = {x.split('=')[0]:str(x.split('=')[1]) for x in query_string.split("&")}

        foo = json_object['foo']

    return JsonResponse({'foo': foo})