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