如何将JSON包装到javascript函数调用中

时间:2017-12-15 12:01:58

标签: python django-views

我需要能够使用python通过django服务器从视图中返回JSON文件。但是,如果url HTTP请求包含一个名为callback的参数,我必须将其包装在一个javascript函数调用中,该调用以' callback'命名。参数。我已经能够创建JSON文件并将其发送到服务器,我知道如何检索可能的回调参数。但是我对将JSON文件包装到Javascript函数调用的方式感到困惑。谁能告诉我正确的方法呢?

def function_json(request, param):
    function_call = request.GET.get('callback', "")
    json_stuff = Object.objects.all().filter(param=parameter)
    if len(json_stuff) == 0:
        return HttpResponse("page was not found",status=404)
    data = {}
    for x in range(0, len(countries)):
        data[json_stuff[x].code] = json_stuff[x].name
    my_json_data = json.dumps(data)
    my_json_data_wrapped_in_a_function_call = ???
    return HttpResponse(my_json_data_wrapped_in_a_function_call, content_type="application/json")

并且数据应该在服务器中显示为

Function_call({json_stuff})

1 个答案:

答案 0 :(得分:0)

假设brick_col = brick_col + 1;是字符串callback,预期结果是字符串`“Function_call({xxx:yyy});”,那么它只是字符串格式化的问题:

"Function_call"

请注意,这是javascript代码,而不是json,因此响应的内容类型不应再是“application / json”。

无关,但是这个:

my_json_data_wrapped_in_a_function_call = "{callback}(json);".format(
    callback=callback, 
    json=json_stuff
    )

可以得到认真改善。首先,python的json_stuff = Object.objects.all().filter(param=parameter) data = {} for x in range(0, len(json_stuff)): data[json_stuff[x].code] = json_stuff[x].name 循环实际上是'foreach'循环 - 你迭代一个序列,迭代变量(for中的'x')设置为序列中的当前项,所以你的以上for x in ...循环应该是:

for

可以使用dict表达式进一步简化:

data = {}
for item in json_stuff:
    data[item.code] = item.name

或者如果您的python版本使用生成器表达式和data = {item.code: item.name for item in json_stuff} 构造函数太旧:

dict

但实际上因为你正在使用Django orm,你不需要任何这个,你可以得到它已经支持,切片和打包:

data = dict((item.code, item.name) for item in json_stuff)

注意:data = Object.objects.filter(param=parameter).values("code", "name") 或更常见的Model.objects.all().filter()变体是多余的。如果您没有其他Model.objects.filter().all().all()filter()或任何要调用的queryset方法调用,则只需exclude()