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

  • 相关阅读:
    函数式语言(老师作业)
    session/cookie
    Linux根目录下各个目录的功能介绍
    Navicat12安装文件和破解补丁
    正则表达式验证示例
    RequestDispatcher接口示例
    hello2部分源码解析
    Introduction of Servlet Filter
    关于hello1中的web.xml解析
    Annotation解释
  • 原文地址:https://www.cnblogs.com/lymmurrain/p/13929521.html
Copyright © 2020-2023  润新知