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)
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)
在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)
看起来Django REST框架在请求中使用HTTP接受标头,以便自动确定要使用的渲染器:
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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
103212 次 |
| 最近记录: |