python - 如何在 Django 中不使用模板返回 JSON?

这与这个问题有关: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')

最佳答案

我认为这个问题对你想要什么感到困惑。我想您实际上并没有尝试将 HTML 放入 JSON 响应中,而是希望返回 HTML 或 JSON。

首先,您需要了解两者的核心区别。 HTML 是一种表现形式。它更多地处理如何显示数据而不是数据本身。 JSON 正好相反。它是纯数据——基本上是你拥有的一些 Python(在本例中)数据集的 JavaScript 表示。它仅用作交换层,允许您将数据从应用程序的一个区域( View )移动到应用程序的另一个区域(您的 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

https://stackoverflow.com/questions/9262278/

相关文章:

json - 任何用于在 Classic ASP 中解析 JSON 的好库?

c# - JavaScriptSerializer.Deserialize - 如何更改字段名称

ios - 在 Swift 中将 JSON 字符串转换为 Object 的简单而干净的方法

javascript - 如何通过 Ajax 请求将 Select2 与 JSON 一起使用?

python - 如何以不同的顺序比较具有相同元素的两个 JSON 对象相等?

java - 在 Spring 中配置 ObjectMapper

json - REST API 最佳实践 : args in query string vs in

javascript - 如何将 JSON 转换为 CSV 格式并存储在变量中

xml - json和xml有什么区别

javascript - 在没有 jQuery 的情况下在 node.js 上合并或合并 JSON