问题描述
这与这个问题有关: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 模板,我该怎么做呢? (content-type 应该是 application /json 而不是 text /html)
编辑 1:
什么会确定 json 和 html 输出?
所以在我看来:
if something:
return render_to_response('html_template',.....)
else:
return HttpReponse(jsondata,mimetype='application/json')
谢谢
最佳解决方案
我认为这个问题对你的想法感到困惑。我想象你实际上并没有将 HTML 放在 JSON 响应中,而是想要替代地返回 HTML 或 JSON 。
首先,你需要了解两者的核心区别。 HTML 是一种表现形式。它更多地涉及如何显示数据而不是数据本身。 JSON 是相反的它是纯数据 – 基本上是一些 Python(在这种情况下) 数据集的 JavaScript 表示。它只是一个互换层,允许您将数据从应用程序 (视图) 的一个区域移动到通常无法访问的应用程序 (JavaScript) 的另一个区域。
考虑到这一点,您不需要”render” JSON,并且没有涉及模板。您只需将 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)
第三种解决方案
在 JSON 响应的情况下,没有要渲染的模板。模板用于生成 HTML 响应。 JSON 是 HTTP 响应。
但是,您可以使用通过 JSON 响应从模板呈现的 HTML 。
html = render_to_string("some.html", some_dictionary)
serialized_data = simplejson.dumps({"html": html})
return HttpResponse(serialized_data, mimetype="application/json")
第四种方案
看起来 Django REST 框架在请求中使用 HTTP accept 标头,以便自动确定要使用的渲染器:
http://www.django-rest-framework.org/api-guide/renderers/
使用 HTTP 接受头可能为您的”if something” 提供了一个替代来源。
第五种方案
为了在 django 1.9 中以 JSON 格式呈现我的模型,我必须在我的 views.py 中执行以下操作:
from django.core import serializers
from django.http import HttpResponse
from .models import Mymodel
def index(request):
objs = Mymodel.objects.all()
jsondata = serializers.serialize('json', objs)
return HttpResponse(jsondata, content_type='application/json')
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。