一尘不染

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

django

我有一个适用于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')

阅读 621

收藏
2020-04-01

共2个答案

一尘不染

我认为这个问题对你想要的东西感到困惑。我想你实际上不是在尝试将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')
2020-04-01
一尘不染

在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)
2020-04-01