项目描述
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()
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("收到了")
方式二:服务端通过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()
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("收到了")
总结
当用django 项目获取Post 发送的请求数据时,如果使用request.POST 获取不到数据可能不是数据未发送过来,可能时对方数据格式request.POST 无法识别处理,
此时可以通过request.body 去排查一下,因为无论什么格式数据,request.body 都能接收,因为request.body 接收的就是原生的请求体数据。