问题描述

这与这个问题有关: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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛