首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Django中不使用模板的情况下返回JSON?

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

Stack Overflow用户
提问于 2012-02-13 22:36:20
回答 9查看 123.2K关注 0票数 85

这与这个问题有关:Django return json and html depending on client python

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

要呈现我将使用的HTML:

代码语言:javascript
复制
return render_to_response('sample/sample.html....')

但是,如果不放置JSON模板,我如何对JSON执行相同的操作呢?( content-type应该是application/json,而不是text/html)

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

所以在我的views.py

代码语言:javascript
复制
if something:
    return render_to_response('html_template',.....)
else:
    return HttpReponse(jsondata,mimetype='application/json')
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-02-13 23:57:39

我想你想要什么这个问题已经弄糊涂了。我想您实际上并不是要将HTML放在JSON响应中,而是希望返回HTML或JSON。

首先,您需要了解两者之间的核心区别。HTML是一种表示格式。它更多地处理如何显示数据,而不是数据本身。JSON正好相反。它是纯数据--基本上是您拥有的一些Python (在本例中)数据集的JavaScript表示。它只是一个交换层,允许你将数据从你的应用程序的一个区域(视图)移动到你的应用程序的另一个区域(你的JavaScript),这通常是无法相互访问的。

考虑到这一点,您不必“呈现”JSON,也不涉及任何模板。您只需将正在使用的任何数据(很可能是作为上下文传递给模板的数据)转换为JSON即可。这可以通过Django的JSON库(simplejson) (如果它是自由格式数据)或它的序列化框架(如果它是一个查询集)来完成。

simplejson

代码语言:javascript
复制
from django.utils import simplejson

some_data_to_dump = {
   'some_var_1': 'foo',
   'some_var_2': 'bar',
}

data = simplejson.dumps(some_data_to_dump)

序列化

代码语言:javascript
复制
from django.core import serializers

foos = Foo.objects.all()

data = serializers.serialize('json', foos)

无论哪种方式,您都可以将该数据传递到响应中:

代码语言:javascript
复制
return HttpResponse(data, content_type='application/json')

在Django 1.6和更早版本中编辑,返回响应的代码是

代码语言:javascript
复制
return HttpResponse(data, mimetype='application/json')

编辑:simplejson was remove from django,您可以使用:

代码语言:javascript
复制
import json

json.dumps({"foo": "bar"})

或者,您可以使用如上所述的django.core.serializers

票数 138
EN

Stack Overflow用户

发布于 2014-11-04 10:43:28

在Django1.7中,使用内置的JsonResponse更容易做到这一点。

https://docs.djangoproject.com/en/dev/ref/request-response/#jsonresponse-objects

代码语言:javascript
复制
# 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)
票数 120
EN

Stack Overflow用户

发布于 2012-02-13 22:39:49

在JSON响应的情况下,不需要呈现模板。模板用于生成HTML响应。JSON是HTTP响应。

但是,您可以使用包含JSON响应的模板来呈现HTML。

代码语言:javascript
复制
html = render_to_string("some.html", some_dictionary)
serialized_data = simplejson.dumps({"html": html})
return HttpResponse(serialized_data, mimetype="application/json")
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9262278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档