我有一个适用于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)
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')
我认为这个问题对你想要的东西感到困惑。我想你实际上不是在尝试将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')
在Django 1.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)