高级视图_JsonResponse对象

本文详细介绍了Django的JsonResponse类,包括其作用、语法特点和使用示例。JsonResponse作为HttpResponse子类,简化了返回JSON数据的过程,默认Content-Type为application/json,并提供safe参数控制是否仅允许字典序列化。文中通过多个例子展示了如何在视图函数中使用JsonResponse,包括处理非字典数据、获取请求头的Token以及从数据库查询数据返回JSON。

JsonResponse对象

1、JsonResponse类是用来将(任意)序列对象dumps成json字符串的。然后将json字符串封装成Response对象返回给浏览器,并且它的Content-Type默认为application/json

2、JsonResponse是HttpResponse的一个子类(有很多的子类),用于帮助创建JSON编码的响应

 

JsonResponse类语法

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)

注:
JsonResponse是HttpResponse的一个子类(有很多的子类),用于帮助创建JSON编码的响应。他从父类继承大部分行为,并具有以下的不同点:
    ⑴JsonResponse对象的默认Content-Type头部设置为application/json
    ⑵它的第一个参数data,应该为一个dict实例。如果safe参数设置为False,它可以是任何可JSON序列化的对象
    ⑶encoder,默认为 django.core.serializers.json.DjangoJSONEncoder,用于序列化data
    ⑷布尔参数safe默认为 True。如果设置为False,可以传递任何对象进行序列化(否则,只允许dict实例)。如果safe为True,而第一个参数传递的不是dict对象,将抛出一个TypeError
    ⑸json_dumps_params是一个字典,它是在生成响应时,传给json.dumps()的参数


例1:
⑴编辑视图

⑵请求

注:
1、这个例子中使用了HttpResponse对象来返回一个json格式的字符串,总体上来说跟上一节介绍的差不多。需要注意的就是需要指定content_type="application/json"以及将字典型的content转为json格式的字符串

2、其实JsonResponse类就是为了是这个过程更加方便:将一些方法封装到JsonResponse类中,我们在返回一个json字符串数据时,就不需要我们去指定content_type值和转换数据类型了


例2:
⑴查看源码

⑵编辑视图

⑶请求

注:
1、默认情况下JsonResponse类只能对字典进行dumps,如果想要对非字典的数据进行dumps的话,那么就需要给JsonResponse传递一个safe=False的参数

2、注意:在Python中字典的标准引号是单引号(Json数据的标准引号是双引号)

例3:非字典型数据,无safe参数
⑴编辑视图


例3_1:非字典型数据,有safe参数
⑴编辑视图

⑵请求

 

例4:解决浏览器编码问题
⑴编辑视图

⑵访问

例4_1:

⑴编辑视图

⑵访问

注:从上面的返回的response对象可以看出

1、JsonResponse()方法返回的是一个JsonResponse对象,其完全就是一条数据,与HTML完全没关系(与HttpResponse对象有很大的区别)

2、返回为JsonResponse对象时:非常适合用于前后端分离开发, 后端只做逻辑, 前端有专业前端工程师做, 后端返回的都是数据, 前端拿到数据再去渲染

 

 

补充

视图函数中获取Token并返回Json数据

例5:
⑴编辑视图

⑵请求

⑶token值错误

注:
1、Django获取http请求头内容:通过view函数传递过来的reuqest,使用request.META.get("header key")来获取

2、注意:
    ⑴header key必须大写,前缀必须是"HTTP",后面如果连接符是横线“-”,要改成下划线“_”
    ⑵例如你的header的key为api_auth,那在Django中应该使用request.META.get("HTTP_API_AUTH")来获取请求头的数据

 

 

拓展

下面这个例子是我自己想的,场景是从数据库中查询一些数据出来,然后把它们整理成一个预期格式的字典,然后返回其对应的Json数据

例6:

⑴编辑视图

# -*- coding: utf-8 -*-
from django.http import HttpResponse,JsonResponse
from polls.models import Article
import datetime
import json


def index(request):

    selectData = Article.objects.filter(id__gte=1).values("title","content","price","author","create_time")
    print(selectData)
    if selectData.count() > 0:#判断查询数据个数
        list = []
        for eachData in selectData:
            #注意这两个if必须是并列关系,而不是if..elif..关系
            if 'create_time' in eachData:
                eachData['create_time'] = eachData['create_time'].strftime("%Y-%m-%d %H:%M:%S")
            else:
                print("该结果中无create_time字段值")

            if 'content' in eachData:
                eachData['content'] = eachData['content'].decode(encoding="utf-8")
            else:
                print("该结果中无content字段值")
            list.append(eachData)#等所有需要更新值的键都更新完后,将整个字典添加到一个列表中,添加完后继续下一次遍历
        result = {}
        result["code"] = "000000"
        result["msg"] = "success"
        result["data"] = list
        return JsonResponse(result,safe=False)
    else:
        result = {}
        result["code"] = "000000"
        result["msg"] = "success"
        result["data"] = None
        return JsonResponse(result, safe=False)
#因为直接从数据库中查询出来的数据中有些数据格式不是我们想要的,因此就需要对这些数据进行处理后更新到原字典中去,
#比如查询出来的时间是一个datetime对象,以及content字段类型为二进制

"""
<QuerySet [
{'title': '西游记', 'price': 132.0, 'author': '吴承恩', 'create_time': datetime.datetime(2020, 5, 17, 14, 25, 9), 'content': b'\xe5\xad\x99\xe6\x82\x9f\xe7\xa9\xba\xe5\xa4\xa7\xe9\x97\xb9\xe5\xa4\xa9\xe5\xae\xab'}, 
{'title': '三国演义', 'price': 154.0, 'author': '罗贯中', 'create_time': datetime.datetime(2020, 5, 17, 14, 25, 57), 'content': b'\xe4\xb8\x9c\xe6\xb1\x89\xe6\x9c\xab\xe5\xb9\xb4\xe5\x88\x86\xe4\xb8\x89\xe5\x9b\xbd'},
{'title': '红楼梦', 'price': 141.0, 'author': '曹雪芹', 'create_time': datetime.datetime(2020, 5, 17, 14, 26, 23), 'content': b'\xe5\x88\x98\xe5\xa7\xa5\xe5\xa7\xa5\xe8\xbf\x9b\xe5\xa4\xa7\xe8\xa7\x82\xe5\x9b\xad'},
{'title': '水浒传', 'price': 140.0, 'author': '施耐庵', 'create_time': datetime.datetime(2020, 5, 17, 14, 27), 'content': b'\xe9\x80\xbc\xe4\xb8\x8a\xe6\xa2\x81\xe5\xb1\xb1'}
]>
"""

⑵请求

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值