当前位置: 首页 > 面试题库 >

如何在Django中不使用模板的情况下返回JSON?

贺靖
2023-03-14
问题内容

我有一个适用于Django应用的命令行Python API。当我通过API访问该应用程序时,它应该返回JSON,而在浏览器中它应该返回HTML。我可以使用不同的URL访问不同的版本,但是如何只用一个模板在views.py中呈现HTML模板和JSON ?

要呈现HTML,我将使用:

return render_to_response('sample/sample.html....')

但是如何在不放置JSON模板的情况下对JSON做同样的事情?(content-type应为application/json而不是text/html

什么将决定JSON和HTML输出?

所以在我的views.py:

if something:
    return render_to_response('html_template',.....)
else:
    return HttpReponse(jsondata,mimetype='application/json')

问题答案:

我认为这个问题对你想要的东西感到困惑。我想你实际上不是在尝试将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)

序列化

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')


 类似资料:
  • 问题内容: 我想在我的(Python)代码中使用Django模板引擎,但是我没有构建基于Django的网站。如何在没有settings.py文件(和其他文件)且无需设置DJANGO_SETTINGS_MODULE环境变量的情况下使用它? 如果我运行以下代码: 我得到: 问题答案: 解决方案很简单。它实际上有据可查,但不太容易找到。(我不得不仔细研究- 当我尝试了几种其他的Google搜索时,它并没

  • 问题内容: 我想在我的(Python)代码中使用Django模板引擎,但是我没有构建基于Django的网站。如何在没有settings.py文件(和其他文件)且无需设置DJANGO_SETTINGS_MODULE环境变量的情况下使用它? 如果我运行以下代码: 我得到: 问题答案: 解决方案很简单。它实际上有据可查,但不太容易找到。(我必须仔细研究-当我尝试了几种其他的Google搜索时并没有出现。

  • 问题内容: 我已经在我的一个Web应用程序中使用了Django ORM,对此我感到非常满意。现在,我有了一个新的需求,它需要数据库,而Django则没有其他要求。我不想花更多的时间来学习另一个像sqlalchemy的ORM。 我想我仍然可以 创建模型,但是如果没有模型,该如何迁移和同步呢? 问题答案: 有关如何加载应用程序的Django 1.11文档 对于最新的Django版本,项目结构为- 您仍

  • 我试图在Java中创建一个方法,它打印fib序列,直到传递给该方法的数字。我的问题是,我需要使用int返回类型来返回序列,而我不能使用递归。

  • 我正在调用一个外部服务来获取,如果该服务不工作,我所需要的只是用填充值

  • 问题内容: 如果我要使用DefaultServeMux(我将其指定为ListenAndServe的第二个参数来指定),那么我可以访问,您可以在Go Wiki的以下示例中看到该: 在当前代码中,我无法使用DefaultServeMux,即我将自定义处理程序传递给ListenAndServe 因此,我没有内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码。例如,如果我一直在使用Defaul