Json 資料處理 django 中 request.post/body 區別
阿新 • • 發佈:2019-01-12
專案描述
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, dataView Code=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 importView Codecsrf_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()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 接收的就是原生的請求體資料。