• Json 数据处理 django 中 request.post/body 区别


    项目描述

    CMDB 资产入库时,需要在客户端采集数据通过requests模块发送请求到服务端,服务端通过django 定义视图函数接收数据并返回状态

    方式一:服务端通过request.body 接收请求

    client 代码

    import requests
    import json
    
    
    def asset():
        info = {'hostname': 'c.com', 'memory': '16G'}
        url = "http://127.0.0.1:8000/api/asset/"
        r1 = requests.post(
            url=url,
            data=json.dumps(info).encode('utf-8')   #对于字典等特殊数据格式需要json 对数据格式化处理,再编码才能传输
        )
        print(r1.text)                                #r1.text 为server 端返回信息
    
    asset()
    View Code

    server  代码

    from django.shortcuts import render,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    import json
    
    
    @csrf_exempt                    #对此试图函数添加csrf装饰器,使得此函数的post请求免验证tooken
    def asset(request):
        """
        收到客户端发送过来的资产信息
        :param request:
        :return:
        """
    
        info = json.loads(request.body.decode('utf-8'))
        """
        b'{"hostname": "c.com", "memory": "16G"}
        #传输的数据为编码后的json 格式需要先解码,在转化后才能当作字典来使用
        """"
    
        print(info)
        return HttpResponse("收到了")
    View Code

    方式二:服务端通过request.POST 接收请求

    client 代码

    import requests
    import json
    
    
    def asset():
        info = {'hostname': 'c.com', 'memory': '16G'}
        url = "http://127.0.0.1:8000/api/asset/"
        r1 = requests.post(
            url=url,
            data={'hostname':'ngix','mem':'6g'}     #在http 传输中会以hostname:ngix&mem:6g 格式传输,这样request.POST 能接收到数据
        )
        print(r1.text)                                #r1.text 为server 端返回信息
    
    asset()
    View Code

    server 代码

    from django.shortcuts import render,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    import json
    
    
    @csrf_exempt                    #对此试图函数添加csrf装饰器,使得此函数的post请求免验证tooken
    def asset(request):
        """
        收到客户端发送过来的资产信息
        :param request:
        :return:
        """
        print(request.POST)               #request.POST 得到的数据是经过处理的请求体数据,requests发送的数据必须
        #为特殊格式的数据才能收到
        """
        在http 请求中发送的请求体格式:
        只有以hostname:ngix&mem:6g 的数据格式传输过来的数据,reques.POST 才能接收处理
        """
        #print(request.body)     #request.body 得到的数据是原生的请求体数据,此时也可以通过body 接收数据
        return HttpResponse("收到了")
    View Code

    总结

    当用django 项目获取Post 发送的请求数据时,如果使用request.POST 获取不到数据可能不是数据未发送过来,可能时对方数据格式request.POST 无法识别处理,

    此时可以通过request.body 去排查一下,因为无论什么格式数据,request.body 都能接收,因为request.body 接收的就是原生的请求体数据。

  • 相关阅读:
    vue导入excel表格
    正则表达式:输入六位数或六位数以下的正整数。
    iview下拉框支持多选
    vue通过jquery方式获取元素
    获取对象属性
    原生JS获取元素,添加事件
    打印当前页面,关闭当前页面
    Andrew Ng 机器学习公开课
    机器学习4《朴素贝叶斯》
    机器学习3《数据集与k-近邻算法》
  • 原文地址:https://www.cnblogs.com/fanggege/p/10260387.html
Copyright © 2020-2023  润新知