请教如何在 ajax 中用 post 方法传递数组。前端用 jquery 后端是 flask。

2014-07-21 19:03:38 +08:00
 forreal
用jquery.param()也不行。
还有一个疑问:
如果post的数据中,不能传递数组的话,request.form.getlist()这个方法是不是永远用不上了?
18315 次点击
所在节点    程序员
20 条回复
chairuosen
2014-07-21 19:14:12 +08:00
传JSON呗
forreal
2014-07-21 19:38:17 +08:00
@chairuosen
我看到jquery官方jquery.post()的api
Example: Pass arrays of data to the server (while still ignoring the return results).

1
$.post( "test.php", { 'choices[]': [ "Jon", "Susan" ] } );
但是我这么用就不行,flask的request.form中只有 'choices[]'="jon"
forreal
2014-07-21 19:39:55 +08:00
@chairuosen
难道是php可以python的flask不可以?
chairuosen
2014-07-21 19:54:58 +08:00
不太清除,
在chrome里看
代码$.post('/',{a:{b:1,c:{d:2,e:3}}})
实际发送的数据是字符串a%5Bb%5D=1&a%5Bc%5D%5Bd%5D=2&a%5Bc%5D%5Be%5D=3 这就得看你的后端解析的怎么样了,不清楚flask
forreal
2014-07-21 20:16:15 +08:00
难道真是flask的问题……
timonwong
2014-07-21 20:25:14 +08:00
首先,你得确认你的ajax请求是什么,虽然默认是application/x-www-form-urlencoded,但是也可以全局的改为其它的类型,比如如果你定义成 application/json, request.form当然就拿不到了

下面的 contentType, 你可以使用 request.form.getlist(),因为都是 request.form
multipart/form-data
application/x-www-form-urlencoded
application/x-url-encoded
forreal
2014-07-21 20:25:22 +08:00
@chairuosen
解决了,我在debug下看的request.form变量,可能是werkzeug的数据结构问题,在debug下只能看到reuqest.form的第一个值,但是调用request.form.getlist()能取到完整的数组。
Hackathon
2014-07-21 20:25:44 +08:00
还没看过flask
Django是把post过来的数据放一份到request.body里
有些复杂格式传递过来, request.GET, request.POST解析不了
这时候你就去request.body里自己取出来解析就可以了
forreal
2014-07-21 20:29:11 +08:00
@timonwong
请求头没改,用debug下观察request.form变量只能看到第一个值,但是其实都解析好了。
正如你说的的得用request.form.getlist()。
多谢。
forreal
2014-07-21 20:30:36 +08:00
@Hackathon
解决了,django了解不多,但还是谢谢你。O(∩_∩)O
xavierskip
2014-07-21 20:40:30 +08:00
js 先 array.toString(),后端再 string.split() 不可以吗?
xiaozhang
2014-07-21 20:44:29 +08:00
也可以用 json

$.ajax({
type: 'POST',
url: url,
data: JSON.stringify({a: [1,2], b: 3}),
contentType: 'application/json'
})


在 flask 里用 request.json 可以直接拿到对应的 dict 对象:

request.json 就是 {'a': [1,2], 'b': 3} 了,request.json.get('a') 就是 [1,2]
yangzh
2014-07-21 22:14:40 +08:00
request.args()
forreal
2014-07-21 22:27:26 +08:00
@xavierskip
可以,但是官方提供了方法,我就尽可能用官方的,array里的字符串如果有逗号,可能还要做特殊处理吧,没试过。
forreal
2014-07-21 22:30:37 +08:00
@xiaozhang
原来javascript里还有JSON.stringify()方法。
我一直没找到javascript的api文档。请问哪里有?(不是jquery的也不是微软的jscript的)
Honwhy
2014-07-21 23:16:07 +08:00
我和你说一个类似的吧
我后端用的struts 2.x,前端用jQuery,用post同样不行
用那种 { 'choices[]': [ "Jon", "Susan" ] }同样不行,后面也是用了
$.ajax这种方式。
xiaozhang
2014-07-22 10:23:27 +08:00
forreal
2014-07-22 11:02:28 +08:00
@Honwhy
不了解struts2,我用jquery时,传的的字典{"ids":[1,2,3]},但是到了flask后请求体的key变为了"ids[]",不知道是jquery还是flask把"ids"变为"ids[]",所以取值时用"ids[]"就可以取出来,而用"ids"不可以。
传json可以作为框架不支持取数组的备用方法。以后打算看一看spring mvc,不知道支不支持直接取数组。
forreal
2014-07-22 11:03:03 +08:00
@xiaozhang
多谢
Codelike
2018-04-25 17:45:39 +08:00
数组转成 json,来进行传递。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/123780

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX