最近在做一个资产管理系统项目,其中有一个部分是客户端向服务端发送采集到的数据的,服务端是Django写的,客户端需要用rrequests模块模拟发送请求

假设发送的数据是这样的:

  data = {'status' : True , 'content' : { 'k1' : 'xxxx' , 'k2' : 'xxxx' }}

是字典套字典的,然后通过requests.post(url = url ,data = data) 发送,会发现在服务端接收到的数据是这样的,<QueryDict>:{  [ 'status' , 'content' ] }

发生了什么,为什么只取到了key,但是没有取到values呢,既然能取到key,说明Django是没问题的

那问题肯定就出在requests.post发送数据上了

好了,铺垫完毕

想一下,ajax是怎么发送数据的

$.ajax ({

  url : 'xxxx',

  data : {

    k1 : 1,
    k2 : 'abc',
    k3 : [1,2,3,4,'s']

    }

  })

呐,只能发送这三种格式吧,没有字典吧,如果非要发送字典,可以通过JSON把字典转成字符串格式,JSON.stringfy({ 'k1':'xxx' })

form 表单也是这样的,而requests.post就是仿造的form表单提交

发现了问题,我们再来剖析一下http发送post请求的过程

ajax发送的data是个字典,是键值对的形式,在http的post请求过程中,把这种键值对转换成

k1=xxx&k2=xxx这种格式,并且会带上一个请求头:

  content-type : application/x-www-form-urlencoded

这个请求头和k1=xxx&k2=xxx这种格式是以一一对应的,只要发送这个格式,就必须带上这个请求头,后台的request.POST会根据这个请求头解析这种格式,还原成以前字典的格式。而且这种格式和这个请求头都是默认的,所以如果我们不修改,直接发送文章开始说的那种格式,服务端就不能解析,所以只拿到字典的key,没拿到value

  但如果是现在这种情况,我们发送的不是这个格式,而是想要发送JSON.stringfy({ 'k1':'xxx' })这种json字符串,也是有办法的,ajax可以自定义请求头,改成这样:  

$.ajax ({

  url : 'xxxx',

  headers : { 'content-type' : 'application/json' },

  data : JSON.stringfy( {k1 : 1,k2 : 'abc',k3 : [1,2,3,4,'s']})

  })

这样后台就会根据json去解析接收到的数据(json格式的字符串)

但是不能用request.POST了,因为request.POST 默认是按k1=xxx&k2=xxx这种格式解析数据的,

应该用request.body去拿数据,再用json.loads一下就拿到这个字典了

默认情况下,form 表单,ajax 以及 requests.post 都是这样处理的

所以在这个项目中,我们需要用requests自定义这个请求头,这个写法就很简单了

requests.post(url = url ,json = data) ,就行了,把原来的data关键字参数换成json关键字参数。

内部做的就是,1.序列化data,2.带一个请求头'content-type' : 'application/json'

这样,服务端拿到的数据,先decode解码一下,在json.loads,就是我们熟悉的字典了

关于form表单或者Ajax向后台发送数据时,数据格式的探究的更多相关文章

  1. iframe和form表单实现ajax请求上传数据

    form的target属性设置为iframe的name值时,表示提交到url后返回的数据显示到iframe区域 <form action="/upload.html" met ...

  2. form表单的ajax验证2

    form表单的ajax验证2: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  3. laravel中form表单,ajax传值没反应

    laravel中form表单,ajax传值没反应时,可能是令牌有问题. form中添加: {{csrf_token()}} ajax中添加: data: {'page': page, '_token' ...

  4. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  5. jQuery实现form表单基于ajax无刷新提交方法详解

    本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC &quo ...

  6. jquery序列化from表单使用ajax提交返回json数据(使用struts2注解result type = json)

    1.action类引入struts2的"json-default"拦截器栈 @ParentPackage("json-default") //示例 @Paren ...

  7. jquery序列化form表单使用ajax提交后处理返回的json数据

    1.返回json字符串: /** 将一个字符串输出到浏览器 */ protected void writeJson(String json) { PrintWriter pw = null; try ...

  8. jQuery动态创建form表单并提交到后台(携带一定的数据进行页面跳转)

    今天遇到这么一个需求,携带一个编号一个名字跳转到另一个JSP页面,直接页面跳转(get携带数据)的话不太安全,于是想到到后台转发一下. 第一种:直接以表单提交方式的进行 JS代码: var form ...

  9. 如何把整张表格的数据通过form表单的方式传回后台

    开发背景: 前段时间遇到这么一个需求,就是把一整张表格的数据存储在数据库中,之后再渲染在页面中,还可以进行重新编辑. 例如下边的课程表(为了方便,所以都是软件工程). 我也是经过一段时间的思考,才实现 ...

随机推荐

  1. Linux平台 Oracle 12cR2 RAC安装Part2:GI配置

    Linux平台 Oracle 12cR2 RAC安装Part2:GI配置 三.GI(Grid Infrastructure)安装 3.1 解压GI的安装包 3.2 安装配置Xmanager软件 3.3 ...

  2. 为何webpack打包后的文件要放在服务器上才能运行

    为何会有此问: 在刚开始使用vue-cli时还不知道打包后的文件要在服务中才能运行,直接点开后发现页面白板,请教大神后得知要起一个服务才能运行起来,当时我脑子中的逻辑是这样的: 因为:js代码是由浏览 ...

  3. 【C++小白成长撸】--矩阵乘法程序

    矩阵乘法是大学矩阵课程中,相比矩阵加减法比较困难的部分. 矩阵乘法的原理: 矩阵乘法在代码中实现 得到目标矩阵的一个元素,涉及两个求和符号,一个求和符号一个for循环,两个求和符号两个for循环,再加 ...

  4. html5 canvas元素使用(一)

    html5新增了一个canvas元素,用于在网页上生成一块矩形区域,用于绘制图像,功能非常强大,下面我来简单介绍一下 在页面中添加canvas <canvas id="canvasDe ...

  5. poj3463 最短路和比最短路长1的路径数

    这题需要很好的理解Dij. 在Dij的基础上,每个点多一个次短路的长度和数量进行控制. 那么在队列中,最短路控制时出现n次,次短路控制出现n次.注意松弛条件中val值和最短路.次短路的关系. 这题需要 ...

  6. NHibernate教程(5)--CRUD操作

    NHibernate之旅(5):探索Insert, Update, Delete操作 2008-10-17 16:31 by 李永京, 42903 阅读, 73 评论, 收藏,  编辑 本节内容 操作 ...

  7. js中防止全局变量被污染的方法

    (function ($){ var oDiv = $('div1');//获取id为'div1'的页面元素 })(function $(id){ return document.getElement ...

  8. RobotFramework自动化测试框架-移动手机自动化测试Input Text和Click Button关键字的使用

    Input Text和Click Button Input Text 关键字一般用来给输入框进行输入操作,该关键字接收两个参数[ locator | text ]. 示例1:启动安卓手机上一个APP的 ...

  9. Alpha个人总结

    一.我的问题: 1.第一章1.2.1 在软件的特殊性中说到,"大型软件有超过数百万行的源代码,上万个不同的文件,而软件工程师通常一次只能看到30-80行源代码,他们的智力.记忆力和常人差不多 ...

  10. 团队作业8----第二次项目冲刺(beta阶段)5.22

    Day4-05.22 1.每日会议 会议内容: 1.帮助新成员进一步了解项目. 2.陈鑫龙说明昨日任务的完成情况. 3.组长林乔桦安排今日的任务. 讨论照片: 2.任务分配情况: 每个人的工作分配表: ...