在Django中如何在不使用模板的情况下返回JSON?

17 浏览
0 Comments

在Django中如何在不使用模板的情况下返回JSON?

这与这个问题有关:Django根据客户端Python返回JSON和HTML


我有一个用于Django应用的命令行Python API。通过API访问应用时,它应该返回JSON;通过浏览器访问时,它应该返回HTML。我可以使用不同的URL访问不同的版本,但是如何在views.py中使用一个模板来渲染HTML模板和JSON呢?

渲染HTML时,我可以使用:

return render_to_response('sample/sample.html....')

但是如果没有放置JSON模板,我应该如何做同样的事情?(content-type应为application/json而不是text/html

是什么决定了JSON和HTML的输出?

因此在我的views.py中:

if something:
    return render_to_response('html_template',.....)
else:
    return HttpReponse(jsondata,mimetype='application/json')

0
0 Comments

在Django中,如果要返回JSON而不使用模板,可能会出现以下原因:

1. JSON响应不需要使用模板来渲染。模板主要用于生成HTML响应,而JSON本身就是HTTP响应。

为了解决这个问题,可以将模板渲染的HTML嵌入到JSON响应中。可以使用以下代码实现:

html = render_to_string("some.html", some_dictionary)
serialized_data = simplejson.dumps({"html": html})
return HttpResponse(serialized_data, mimetype="application/json")

需要注意的是,这里使用了`render_to_string()`函数来渲染模板,并将结果存储在`html`变量中。然后使用`simplejson.dumps()`函数将HTML转换为JSON格式的字符串,并将其作为HTTP响应返回。

另外,需要注意的是,`simplejson.dumps()`函数用于对对象进行序列化,将其转换为JSON格式的字符串。

如果要使用`json`模块替代`simplejson`模块也可以,两者都可以实现JSON的序列化和反序列化。

0
0 Comments

在Django 1.7中,使用内置的JsonResponse更加简单。

首先,我们需要导入JsonResponse类:

from django.http import JsonResponse

然后,我们可以在视图函数中使用JsonResponse来返回JSON数据。首先,我们需要准备好要返回的数据,可以是任何Python数据类型,比如字典、列表等。

接下来,我们可以在视图函数中创建一个字典对象作为数据:

data = {}

然后,我们只需要调用JsonResponse类,并传入数据对象作为参数,就可以返回JSON数据了:

return JsonResponse(data)

这样,我们就可以在不使用模板的情况下返回JSON数据了。

0
0 Comments

问题的原因是想要在Django中返回HTML或JSON数据。HTML是一种用于展示数据的格式,而JSON则是纯数据的格式。为了实现这个目的,可以使用Django的JSON库(simplejson)将数据转化为JSON格式,或者使用序列化框架将查询集转化为JSON格式。然后将这些数据传递给HttpResponse函数,设置content_type为'application/json'即可返回JSON数据。

解决方法如下:

simplejson

from django.utils import simplejson
some_data_to_dump = {
   'some_var_1': 'foo',
   'some_var_2': 'bar',
}
data = simplejson.dumps(some_data_to_dump)

Serialization

from django.core import serializers
foos = Foo.objects.all()
data = serializers.serialize('json', foos)

然后将这些数据传递给HttpResponse函数:

return HttpResponse(data, content_type='application/json')

在Django 1.6及更早版本中,返回响应的代码为:

return HttpResponse(data, mimetype='application/json')

在Django 1.5版本中,simplejson库被认为是过时的,可以使用import json ; json.dumps(data)来代替。

如果想要确定视图中的响应请求是通过API请求JSON数据,可以使用request.is_ajax()来判断。但是这需要确保HTTP_X_REQUESTED_WITH头已设置。另外,也可以在URL中附加查询字符串?json,然后检查request.GET.has_key('json')。这种方法可能更为可靠。

在Django 1.7版本中,content_type应设置为'application/json',而不是mimetype。

0