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 接收的就是原生的请求体数据。

原文地址:https://www.cnblogs.com/fanggege/p/10260387.html