前置知識
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再發送,但我也沒實際嘗試過,相應方法可參考
雜談原生django與drf
如果你直接使用drf來開發接口,那就不會出現以上情況了,drf中post數據從request.data中獲取,不必考慮在POST,還是body中獲取,也不必考慮需不需要json反序列化,post數據drf在dispatch時直接給你封裝好在request.data中了。再次感嘆drf真好用呀。