欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django后端接收嵌套Json數(shù)據(jù)及解析詳解

 更新時間:2019年07月17日 14:30:26   作者:三級狗  
這篇文章主要介紹了Django后端接收嵌套Json數(shù)據(jù)及解析詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

0、干貨先寫在前

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

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

下面是這個問題產(chǎn)生及解決的過程,還有一些可能的應(yīng)用場景。

1、傳統(tǒng)方式解析表單數(shù)據(jù)

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

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

在后臺采用`request.POST`進(jìn)行數(shù)據(jù)接收:

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,打印如下:

可以看到這里的數(shù)據(jù)是按照J(rèn)son的格式傳遞的,后臺也完美地進(jìn)行解析,但是,如果前端傳遞的數(shù)據(jù)為嵌套的Json,這種寫法就開始出現(xiàn)問題!

2、解析嵌套的Json數(shù)據(jù)

前端代碼修改如下:

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

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

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

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

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

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

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

到了這一步就基本不用說啥了,完整接收了前端的json字符串并解析,這里如果不想安裝第三方庫simplejson的話,使用python自帶的json模塊也是可以解析的,只是在解析時需要將request.body進(jìn)行一次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')

程序輸出:

之前主要是因?yàn)閷懬岸私o數(shù)據(jù)的時候沒有使用JSON.stringify()進(jìn)行處理。導(dǎo)致后臺無論什么方法解析都是一團(tuán)糟。

3、簡述應(yīng)用場景

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中MYSQLdb出現(xiàn)亂碼的解決方法

    Python中MYSQLdb出現(xiàn)亂碼的解決方法

    這篇文章主要介紹了Python中MYSQLdb出現(xiàn)亂碼的解決方法,是Python操作MySQL數(shù)據(jù)庫程序設(shè)計(jì)中非常常見的問題,需要的朋友可以參考下
    2014-10-10
  • python讀寫文件write和flush的實(shí)現(xiàn)方式

    python讀寫文件write和flush的實(shí)現(xiàn)方式

    今天小編就為大家分享一篇python讀寫文件write和flush的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python獲取二維矩陣每列最大值的方法

    Python獲取二維矩陣每列最大值的方法

    下面小編就為大家分享一篇Python獲取二維矩陣每列最大值的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python中sklearn的pipeline模塊實(shí)例詳解

    python中sklearn的pipeline模塊實(shí)例詳解

    這篇文章主要介紹了python中sklearn的pipeline模塊的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Django框架表單操作實(shí)例分析

    Django框架表單操作實(shí)例分析

    這篇文章主要介紹了Django框架表單操作,結(jié)合實(shí)例形式分析了Django框架表單數(shù)據(jù)發(fā)送、請求相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • Django結(jié)合ajax進(jìn)行頁面實(shí)時更新的例子

    Django結(jié)合ajax進(jìn)行頁面實(shí)時更新的例子

    今天小編就為大家分享一篇Django結(jié)合ajax進(jìn)行頁面實(shí)時更新的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Jupyter中markdown的操作方法

    Jupyter中markdown的操作方法

    Jupyter Notebook是基于網(wǎng)頁的用于交互計(jì)算的應(yīng)用程序,Jupyter notebook,作為Python廣受歡迎的一款I(lǐng)DLE,其直觀性、簡易性、易于閱讀等優(yōu)點(diǎn)廣受許多Python用戶所推薦,這篇文章介紹Jupyter中markdown的操作,感興趣的朋友一起看看吧
    2024-01-01
  • python中正則表達(dá)式findall的用法實(shí)例

    python中正則表達(dá)式findall的用法實(shí)例

    在寫著自動化測試的腳本時重新復(fù)習(xí)了一下正則表達(dá)式findall()方法,下面這篇文章主要給大家介紹了關(guān)于python中正則表達(dá)式findall用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 聊聊Python中關(guān)于a=[[]]*3的反思

    聊聊Python中關(guān)于a=[[]]*3的反思

    這篇文章主要介紹了Python中關(guān)于a=[[]]*3的反思,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Python基礎(chǔ)入門之seed()方法的使用

    Python基礎(chǔ)入門之seed()方法的使用

    這篇文章主要介紹了Python基礎(chǔ)入門之seed()方法的使用,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05

最新評論