Django视图返回json而不使用模板

Nee*_*ran 77 python django json django-views

这与此问题有关:Django根据客户端python返回json和html

我有一个django应用程序的命令行python api.当我通过api访问应用程序时它应该返回json并且使用浏览器它应该返回html.我可以使用不同的URL来访问不同的版本,但是如何使用一个模板在views.py中呈现html模板和json?

要呈现我将使用的HTML:

return render_to_response('sample/sample.html....')
Run Code Online (Sandbox Code Playgroud)

但是如果没有放入json模板,我将如何为json做同样的事情呢?(内容类型应该是application/json而不是text/html)

编辑1:

什么会决定json和html输出?

所以在我看来:

if something:
    return render_to_response('html_template',.....)
else:
    return HttpReponse(jsondata,mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)

谢谢

Chr*_*att 126

我认为这个问题已经让你感到困惑.我想你实际上并没有尝试将HTML放在JSON响应中,而是想要返回HTML或JSON.

首先,您需要了解两者之间的核心差异.HTML是一种表现形式.它更多地涉及如何显示数据而不是数据本身.JSON正好相反.它是纯数据 - 基本上是您拥有的某些Python(在本例中)数据集的JavaScript表示.它仅用作交换层,允许您将数据从应用程序的一个区域(视图)移动到应用程序的另一个区域(您的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)
Run Code Online (Sandbox Code Playgroud)

序列化

from django.core import serializers

foos = Foo.objects.all()

data = serializers.serialize('json', foos)
Run Code Online (Sandbox Code Playgroud)

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

return HttpResponse(data, content_type='application/json')
Run Code Online (Sandbox Code Playgroud)

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

return HttpResponse(data, mimetype='application/json')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,现在认为simplejson [由Django 1.5弃用](https://docs.djangoproject.com/en/dev/releases/1.5/#system-version-of-simplejson-no-longer-used).使用`import json; json.dumps(数据)`而不是. (14认同)
  • 在我的情况下(Django 1.7),它是content_type ='application/json',而不是mimetype (14认同)

dav*_*ert 96

在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)
Run Code Online (Sandbox Code Playgroud)


Uku*_*kit 8

在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")
Run Code Online (Sandbox Code Playgroud)


Cha*_*ndt 7

看起来Django REST框架在请求中使用HTTP接受标头,以便自动确定要使用的渲染器:

http://www.django-rest-framework.org/api-guide/renderers/

使用HTTP接受标头可以为您的"if something"提供替代来源.


Rap*_*tor 6

为了在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')
Run Code Online (Sandbox Code Playgroud)