请教如何在 ajax 中用 post 方法传递数组。前端用 jquery 后端是 flask。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
forreal
V2EX    程序员

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

  •  
  •   forreal 2014-07-21 19:03:38 +08:00 18679 次点击
    这是一个创建于 4104 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用jquery.param()也不行。
    还有一个疑问:
    如果post的数据中,不能传递数组的话,request.form.getlist()这个方法是不是永远用不上了?
    20 条回复    2018-04-25 17:45:39 +08:00
    chairuosen
        1
    chairuosen  
       2014-07-21 19:14:12 +08:00
    传JSON呗
    forreal
        2
    forreal  
    OP
       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
        3
    forreal  
    OP
       2014-07-21 19:39:55 +08:00
    @chairuosen
    难道是php可以python的flask不可以?
    chairuosen
        4
    chairuosen  
       2014-07-21 19:54:58 +08:00   1
    不太清除,
    在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
        5
    forreal  
    OP
       2014-07-21 20:16:15 +08:00
    难道真是flask的问题……
    timonwong
        6
    timonwong  
       2014-07-21 20:25:14 +08:00   1
    首先,你得确认你的ajax请求是什么,虽然默认是application/x-www-form-urlencoded,但是也可以全局的改为其它的类型,比如如果你定义成 application/json, request.form当然就拿不到了

    下面的 contentType, 你可以使用 request.frm.getlist(),因为都是 request.form
    multipart/form-data
    application/x-www-form-urlencoded
    application/x-url-encoded
    forreal
        7
    forreal  
    OP
       2014-07-21 20:25:22 +08:00
    @chairuosen
    解决了,我在debug下看的request.form变量,可能是werkzeug的数据结构问题,在debug下只能看到reuqest.form的第一个值,但是调用request.form.getlist()能取到完整的数组。
    Hackathon
        8
    Hackathon  
       2014-07-21 20:25:44 +08:00   1
    还没看过flask
    Django是把post过来的数据放一份到request.body里
    有些复杂格式传递过来, request.GET, request.POST解析不了
    这时候你就去request.body里自己取出来解析就可以了
    forreal
        9
    forreal  
    OP
       2014-07-21 20:29:11 +08:00
    @timonwong
    请求头没改,用debug下观察request.form变量只能看到第一个值,但是其实都解析好了。
    正如你说的的得用request.form.getlist()。
    多谢。
    forreal
        10
    forreal  
    OP
       2014-07-21 20:30:36 +08:00
    @Hackathon
    解决了,django了解不多,但还是谢谢你。O(∩_∩)O
    xavierskip
        11
    xavierskip  
       2014-07-21 20:40:30 +08:00   1
    js 先 array.toString(),后端再 string.split() 不可以吗?
    xiaozhang
        12
    xiaozhang  
       2014-07-21 20:44:29 +08:00   1
    也可以用 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
        13
    yangzh  
       2014-07-21 22:14:40 +08:00
    request.args()
    forreal
        14
    forreal  
    OP
       2014-07-21 22:27:26 +08:00
    @xavierskip
    可以,但是官方提供了方法,我就尽可能用官方的,array里的字符串如果有逗号,可能还要做特殊处理吧,没试过。
    forreal
        15
    forreal  
    OP
       2014-07-21 22:30:37 +08:00
    @xiaozhang
    原来Javascript里还有JSON.stringify()方法。
    我一直没找到Javascript的api文档。请问哪里有?(不是jquery的也不是微软的jscript的)
    Honwhy
        16
    Honwhy  
       2014-07-21 23:16:07 +08:00   1
    我和你说一个类似的吧
    我后端用的struts 2.x,前端用jQuery,用post同样不行
    用那种 { 'choices[]': [ "Jon", "Susan" ] }同样不行,后面也是用了
    $.ajax这种方式。
    forreal
        18
    forreal  
    OP
       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
        19
    forreal  
    OP
       2014-07-22 11:03:03 +08:00
    @xiaozhang
    多谢
    Codelike
        20
    Codelike  
       2018-04-25 17:45:39 +08:00
    数组转成 json,来进行传递。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2893 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:56 PVG 21:56 LAX 06:56 JFK 09:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86