Django视图不使用模板返回json
这与这个问题有关: Django根据客户端python返回json和html
我有一个Django应用程序的命令行python api。 当我通过api访问应用程序时,它应该返回json和浏览器它应该返回HTML。 我可以使用不同的URL来访问不同的版本,但是如何在views.py中使用一个模板渲染html模板和json?
要呈现的HTML我会使用:
return render_to_response('sample/sample.html....)
但是,我怎样才能没有把json模板做同样的json? (内容types应该是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表示forms。 它只是一个交换层,允许您将数据从应用程序的一个区域(视图)移动到应用程序的另一个区域(您的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')
在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接受头,以自动确定使用哪个渲染器:
http://www.django-rest-framework.org/api-guide/renderers/
使用HTTP接受头可能会为你的“如果有的东西”提供一个替代的来源。
为了在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')
您也可以检查rfc中指定的请求接受内容types。 这样,你可以呈现默认的HTML和你的客户接受应用程序/杰森你可以返回json在你的回应,而不需要模板
from django.utils import simplejson from django.core import serializers def pagina_json(request): misdatos = misdatos.objects.all() data = serializers.serialize('json', misdatos) return HttpResponse(data, mimetype='application/json')
如果要将结果作为渲染模板传递,则必须加载并渲染模板,将渲染结果传递给json.This可能如下所示:
from django.template import loader, RequestContext #render the template t=loader.get_template('sample/sample.html') context=RequestContext() html=t.render(context) #create the json result={'html_result':html) json = simplejson.dumps(result) return HttpResponse(json)
这样,您可以将呈现的模板作为json传递给客户端。 这可能是有用的,如果你想完全取代即。 包含许多不同的元素。