中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django后端接收嵌套Json數據及解析詳解

發布時間:2020-10-08 05:12:17 來源:腳本之家 閱讀:386 作者:三級狗 欄目:開發技術

0、干貨先寫在前

1、前端傳值的數據必須使用JSON.stringify()傳化

2、后端,通過request.body接收數據,直接使用json.loads解析,解析前,先decode一下:receive_data = json.loads(request.body.decode())。如果使用simplejson.loads(request.body),就不用decode()

下面是這個問題產生及解決的過程,還有一些可能的應用場景。

1、傳統方式解析表單數據

之前用Django后臺接收數據的時候,一直采用的是表單的形式,通過Ajax傳值的時候也是一樣,直接通過鍵值對兒將值傳遞給后臺,前端代碼類似這樣:

$.post("/login/",
    {
    "user":"threedog",
    "password":"123456"
    },
    function (res) {
      console.log(res)
  });

在后臺采用`request.POST`進行數據接收:

class Login(View):
  def get(self,request):
    return render(request,'login.html')
 
  def post(self,request):
    print(request.POST)
    print("user :",end='')
    print(request.POST.get('user',None))
    print("password :",end='')
    print(request.POST.get('password',None))
    return HttpResponse('OK')

后臺接收到的是一個QueryDict,打印如下:

Django后端接收嵌套Json數據及解析詳解

可以看到這里的數據是按照Json的格式傳遞的,后臺也完美地進行解析,但是,如果前端傳遞的數據為嵌套的Json,這種寫法就開始出現問題!

2、解析嵌套的Json數據

前端代碼修改如下:

$.post("/login/",
    {
    "user":{
      'name':'threedog',
      'age':18,
      'sex':'男'
    },
    "password":"123456"
    },
    function (res) {
      console.log(res)
  });

這個時候后臺收到的東西就有意思了:

Django后端接收嵌套Json數據及解析詳解

password取值正常,但是user沒能拿到值,而QueryDict的打印我們發現,原本是嵌套的字典,現在全部由兩個鍵名合并成了新的鍵諸如:'user[sex]','user[age]'。這樣的鍵到了后臺是沒辦法按照普通字典或者json來進行解析的。

上網查,說是要使用request.raw_post_data代替request.POST就可以,然而很遺憾,報錯再查之下發現,raw_post_data在Django1.4版本之后被取消,我使用的是Django1.11。再往下查,知道了要使用request.body,還要通過simplejson來解析。

但是request.body的解析仍然不順利,前端不變,后臺直接打印request.body的結果如下:

Django后端接收嵌套Json數據及解析詳解

一個包含了鍵值對兒的二進制字符串,這個時候按網上的辦法使用simplejson.loads()解析會報錯:simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)。不用在這個上面糾結了,simplejson直接解析不了這個body。

后來靈感突發,發現前端在給出的數據原本就是JS中的object,并不是json的字符串,所以把前段的數據使用JSON.stringify()進行轉換后,打印request.body以及通過simplejson.load()解析發現了令人驚喜的輸出:

Django后端接收嵌套Json數據及解析詳解

到了這一步就基本不用說啥了,完整接收了前端的json字符串并解析,這里如果不想安裝第三方庫simplejson的話,使用python自帶的json模塊也是可以解析的,只是在解析時需要將request.body進行一次decode()即可。完整代碼如下

前端:

$.post("/login",
    JSON.stringify({
    "user":{
      'name':'threedog',
      'age':18,
      'sex':'男'
    },
    "password":"123456"
    }),
    function (res) {
      console.log(res)
  });

后臺:

class Login(View):
  def get(self,request):
    return render(request,'login.html')
 
  def post(self,request):
    print(request.body)
    receive_data = simplejson.loads(request.body)
    print(receive_data)
    receive_data = json.loads(request.body.decode())
    print(receive_data)
    return HttpResponse('OK')

程序輸出:

Django后端接收嵌套Json數據及解析詳解

之前主要是因為寫前端給數據的時候沒有使用JSON.stringify()進行處理。導致后臺無論什么方法解析都是一團糟。

3、簡述應用場景

這個應用場景非常常見,除了我剛才提到的,前端給后臺的,是嵌套的json數據的情況。還有微信小程序給后臺數據,也需要JSON.stringify()處理給json,還有安卓,IOS app訪問網站后臺提交數據,都需要這種方式傳值和解析。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 安远县| 罗江县| 廊坊市| 昌平区| 大足县| 韶山市| 塔河县| 基隆市| 东源县| 突泉县| 类乌齐县| 湘潭县| 黎平县| 兴隆县| 安徽省| 花垣县| 瓮安县| 康马县| 鲜城| 三都| 高雄市| 三原县| 从江县| 始兴县| 黄梅县| 休宁县| 抚宁县| 乳源| 清镇市| 葫芦岛市| 锡林郭勒盟| 垣曲县| 沧州市| 红安县| 和田市| 静安区| 祁阳县| 五大连池市| 襄城县| 桐梓县|