Backend - Django JsonResponse  HttpResponse

目录

一、关系

二、使用

(一)data 字典传值

1. HttpResponse

(1)写法

(2)前端接收 HttpResponse 回传的值

2. JsonResponse

(1)写法

(2)前端接收 JsonResponse 回传的值

3. 特殊数据类型的处理

4. 例子

(二)JsonResponse 有一个 safe 参数

1. safe 作用

2. 若报错:TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False

(1)原因

(2)解决


一、关系

        JsonResponse 是 HttpResponse 的一个子类。

        从1.7版本开始,Django使用内置JsonResponse类。

二、使用

(一)data 字典传值

1. HttpResponse

(1)写法

HttpResponse 的 content 参数值必须是引号包裹的字符串。

比如,若 data 参数值是个对象(字典),则用 json.dumps 将 data 值转成JSON字串。

# HttpResponse
import json
return HttpResponse(json.dumps(mydict))
(2)前端接收 HttpResponse 回传的值

因为,HttpResponse传的值是通过json处理后的字串格式。所以,前端ajax收到的data是json字串格式,需要用JSON.parse(data)处理,去除json字串。

2. JsonResponse

(1)写法

JsonResponse 的 data 参数可以是个对象(字典)。

# JsonResponse
from django.http import JsonResponse
return JsonResponse(mydict)
(2)前端接收 JsonResponse 回传的值

因为,JsonResponse传的值是字典,没有经过json处理。所以,前端可以不用JSON.parse(data)处理,直接使用。

3. 特殊数据类型的处理

        若是queryset类型的列表,可以先利用列表生成式转换成阵列,再传给前端。

# JsonResponse
from django.http import JsonResponse
myqst = models.Book.objects.filter(booktype='文艺类').values_list('name', flat=True)
mylist = [m for m in myqst]
return JsonResponse(mylist)

4. 例子

import json
from django.http import JsonResponse
data= {'name': '萝卜干'}# 第一种
HttpResponse(json.dumps(data), content_type='application/json')  # 第一个参数位置,默认是content的参数值,第二个位置需要指定是什么参数的值,比如content_type=XXX# 第二种(几乎等价于第一种)
JsonResponse(data)  # 默认的content_type='application/json'

 json相关知识可参考另一篇文章:Backend - Python 序列化-CSDN博客

(二)JsonResponse 有一个 safe 参数

1. safe 作用

        默认为 True,控制JsonResponse中只有dict对象可以序列化。

2. 若报错:TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False

(1)原因

        JsonResponse中的safe参数为True,要求data值类型必须为字典,若非字典则抛出一个 TypeError 类型错误。  

(2)解决

        方法① 传data参数为字典类型。

        方法② 若想传列表List类型等,则设置参数safe=False。如下面代码:

return JsonResponse(result)
# 改为:
return JsonResponse(result, safe=False)