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 请求,后端接收不到参数的解决方案

posted @ 2020-11-05 00:08  lymmurrain  阅读(1873)  评论(0编辑  收藏  举报