这与这个问题有关:Django return json and html depending on client python
我有一个用于Django应用程序的命令行Python API。当我通过API访问应用程序时,它应该返回JSON,对于浏览器,它应该返回HTML。我可以使用不同的URL来访问不同的版本,但是如何使用一个模板在views.py中呈现HTML模板和JSON呢?
要呈现我将使用的HTML:
return render_to_response('sample/sample.html....')
但是,如果不放置JSON模板,我如何对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')
发布于 2012-02-13 15:57:39
我想你想要什么这个问题已经弄糊涂了。我想您实际上并不是要将HTML放在JSON响应中,而是希望返回HTML或JSON。
首先,您需要了解两者之间的核心区别。HTML是一种表示格式。它更多地处理如何显示数据,而不是数据本身。JSON正好相反。它是纯数据--基本上是您拥有的一些Python (在本例中)数据集的JavaScript表示。它只是一个交换层,允许你将数据从你的应用程序的一个区域(视图)移动到你的应用程序的另一个区域(你的JavaScript),这通常是无法相互访问的。
考虑到这一点,您不必“呈现”JSON,也不涉及任何模板。您只需将正在使用的任何数据(很可能是作为上下文传递给模板的数据)转换为JSON即可。这可以通过Django的JSON库(simplejson) (如果它是自由格式数据)或它的序列化框架(如果它是一个查询集)来完成。
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)
序列化
from django.core import serializers
foos = Foo.objects.all()
data = serializers.serialize('json', foos)
无论哪种方式,您都可以将该数据传递到响应中:
return HttpResponse(data, content_type='application/json')
在Django 1.6和更早版本中编辑,返回响应的代码是
return HttpResponse(data, mimetype='application/json')
编辑:simplejson was remove from django,您可以使用:
import json
json.dumps({"foo": "bar"})
或者,您可以使用如上所述的django.core.serializers
。
发布于 2014-11-04 02:43:28
在Django1.7中,使用内置的JsonResponse更容易做到这一点。
https://docs.djangoproject.com/en/dev/ref/request-response/#jsonresponse-objects
# import it
from django.http import JsonResponse
def my_view(request):
# do something with the your data
data = {}
# just return a JsonResponse
return JsonResponse(data)
发布于 2012-02-13 14:39:49
在JSON响应的情况下,不需要呈现模板。模板用于生成HTML响应。JSON是HTTP响应。
但是,您可以使用包含JSON响应的模板来呈现HTML。
html = render_to_string("some.html", some_dictionary)
serialized_data = simplejson.dumps({"html": html})
return HttpResponse(serialized_data, mimetype="application/json")
https://stackoverflow.com/questions/9262278
复制相似问题