axios與djangopost通信 后端獲取數據


前置知識

ajax形式post提交數據的content-type有主要常用三種

  • application/x-www-form-urlencoded
  • multipart/form-data(上傳文件)
  • application/json

原生的django對於content-type為application/x-www-form-urlencoded 的ajax請求,且data經過urlencoded編碼,其數據是放在request.POST(request.body中也會有數據,但是格式得自己重新反序列化)中的。,data若無編碼直接上傳,會放在request.body中,而request.POST中是錯誤格式的數據。

對於multipart/form-data,數據是放在request.FILES中的

而對於最常用的 application/json 數據是放在request.body中的,是無法在request.POST中獲取的。

axios默認content-type為 application/json

所以如果你像如下方式使用axios與django通信

axios({
    url:url,
    data:data,
    method:'post'
})

你用原生django只能通過request.body獲取數據,而這時的request.body為bytes類型,可通過json.loads(request.body)獲取前端傳過來的字典。

#有些人直接json.loads(request.body)會報錯,原因可能是body中是byte string,可能要解碼成unicode string才行,不過我自己的項目中可直接反序列化。如果你也出現相應問題,可嘗試使用下列方法
body_unicode = request.body.decode('utf-8')
body = json.loads(body_unicode)
content = body['content']

在前端解決問題

使用qs,或者URLSearchParams處理data再發送,但我也沒實際嘗試過,相應方法可參考

axios 發 post 請求,后端接收不到參數的解決方案

雜談原生django與drf

如果你直接使用drf來開發接口,那就不會出現以上情況了,drf中post數據從request.data中獲取,不必考慮在POST,還是body中獲取,也不必考慮需不需要json反序列化,post數據drf在dispatch時直接給你封裝好在request.data中了。再次感嘆drf真好用呀。

參考文獻

django request.POST和request.body獲取值時出現的情況

axios 發 post 請求,后端接收不到參數的解決方案


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM