1. 程式人生 > >Json 資料處理 django 中 request.post/body 區別

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 接收的就是原生的請求體資料。