• [3] Django返回json数据


    面向接口编程

    英文:Interface-Oriented Programming

    面向接口编程的思想,在项目中广泛应用。后台不直接做页面跳转,只向前端响应数据,响应的数据格式习惯用json,前端通过ajax和接口对接。

    • 概念:API应用程序接口
      如果程序功能只向前台提供数据不做页面跳转,我们该功能称为“应用程序接口” ,数据可以供给其他程序对接。

    英文 “API”,简称“接口Interface” . API数据的格式有xml 或 json, 程序中习惯用json

    • 真实应用: 生活中常用的社会公共服务器数据都是来源于第三方提供的接口。

    • 第三方接口平台: 短信下发,快递查询,天气查询,手机归属地,航班和火车时刻,新闻头条等....

       聚合数据:https://www.juhe.cn/
    



    程序中我们可以模仿社会公开接口,写自己的接口。 使用接口开发的优点: 能实现代码复用,跨平台(手机,pc项目都可以调用)

    Django实现后台接口(API)

    特点

    • 返回的数据格式 : json 字符串

    在一个网站在,大量数据与前端交互,JSON是最好的传递数据方式了。
    在Django中,使用JSON传输数据,有两种方式,一种是使用Python的JSON包,一种是使用Django的JsonResponse

    使用Python的JSON包

    • json.dumps(变量)
    from django.shortcuts import HttpResponse
    import json
    def testjson(request):
        data={
            'patient_name': '张三',
            'age': '25',
            'patient_id': '19000347',
            '诊断': '上呼吸道感染',
        }
        return HttpResponse(json.dumps(data))
    

    怎么是乱码了?有中文的都是乱码了?这不是乱码,这是中文在内存中的二进制表现形式而已,使用JSON的转换工具可以看到中文的。
    我们看一下Response Headers响应头,其中的Content-Type是text/html,我明明传的是JSON啊,怎么会变成字符串类型了?这是因为我们没有告诉浏览器,我们要传一个JSON数据,那么,怎么告诉浏览器呢?

    HttpResponse是继承HttpResponseBase的,我们可以告诉浏览器,我要传application/json数据。我们稍微改一下content的值,看看会变成什么?

    def testjson(request):
        data={
            'patient_name': '张三',
            'age': '25',
            'patient_id': '19000347',
            '诊断': '上呼吸道感染',
        }
        return HttpResponse(json.dumps(data), content_type='application/json')
    

    再访问网页:


    这下好了,是传输JSON了,在Preview中可以正常显示出来了。

    使用JsonResponse进行传输。

    def testjson(request):
        data={
            'patient_name': '张三',
            'age': '25',
            'patient_id': '19000347',
            '诊断': '上呼吸道感染',
        }
        return JsonResponse(data)
    

    访问网页:


    一切正常。
    看一下JsonResponse的源码:

    class JsonResponse(HttpResponse):
        """
        An HTTP response class that consumes data to be serialized to JSON.
    
        :param data: Data to be dumped into json. By default only ``dict`` objects
          are allowed to be passed due to a security flaw before EcmaScript 5. See
          the ``safe`` parameter for more information.
        :param encoder: Should be a json encoder class. Defaults to
          ``django.core.serializers.json.DjangoJSONEncoder``.
        :param safe: Controls if only ``dict`` objects may be serialized. Defaults
          to ``True``.
        :param json_dumps_params: A dictionary of kwargs passed to json.dumps().
        """
    
        def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                     json_dumps_params=None, **kwargs):
            if safe and not isinstance(data, dict):
                raise TypeError(
                    'In order to allow non-dict objects to be serialized set the '
                    'safe parameter to False.'
                )
            if json_dumps_params is None:
                json_dumps_params = {}
            kwargs.setdefault('content_type', 'application/json')
            data = json.dumps(data, cls=encoder, **json_dumps_params)
            super().__init__(content=data, **kwargs)
    
    

    其内部也是通过json.dumps来把数据转换为JSON的,其还可以转换为list类型。我们再来改一下testjson

    def testjson(request):
          listdata = ["张三", "25", "19000347", "上呼吸道感染"]
          return JsonResponse(listdata)
    

    程序报错了

    报错为:In order to allow non-dict objects to be serialized set the safe parameter to False,它的意思是转换为一个非字典的类型时,safe参数要设置为False,还记得上面JsonResponse的原码吗?其中就有
    代码修改为:

    def testjson(request):
           listdata = ["张三", "25", "19000347", "上呼吸道感染"]
           return JsonResponse(listdata, safe=False)
    



    这下正常了。
    有时我们从数据库取出来的数据,很多是列表类型的,特别是用cx_Oracle包在Oracle数据库取出来的数据,其不支持直接字典的输出,输出就是一个list,这时我们使用JsonResponse(data, safe=False)就可以直接输换为Json,发送到前端了。

    对象转换为json报错

    提示: 对象不能直接序列化,待补充

    更多交流,请加QQ:390351113.请备注好友来自博客园<IT自学吧>
  • 相关阅读:
    md基本语法
    CodeBlocks安装使用、汉化以及更改配色
    hexo+github搭建个人博客教程和各种坑记录
    GB/T 38637.1-2020 物联网 感知控制设备接入 第1部分:总体要求
    山东大学909数据结构与程序设计考研经验分享
    GB/T 39083-2020 快递服务支付信息交换规范
    GB/T 38829-2020 IPTV媒体交付系统技术要求 内容接入
    GB/T 37733.3-2020 传感器网络 个人健康状态远程监测 第3部分:终端技术要求
    GB/T 38801-2020 内容分发网络技术要求 互联应用场景
    GB/T 30269.809-2020 信息技术 传感器网络 第809部分:测试:基于IP的无线传感器网络网络层协议一致性测试
  • 原文地址:https://www.cnblogs.com/itzixueba/p/13229534.html
Copyright © 2020-2023  润新知