我需要能够使用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})
答案 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()
。