请教如何在 ajax 中用 post 方法传递数组。前端用 jquery 后端是 flask。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
forreal

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

  •  
  •   forreal Jul 21, 2014 19050 views
    This topic created in 4300 days ago, the information mentioned may be changed or developed.
    用jquery.param()也不行。
    还有一个疑问:
    如果post的数据中,不能传递数组的话,request.form.getlist()这个方法是不是永远用不上了?
    20 replies    2018-04-25 17:45:39 +08:00
    chairuosen
        1
    chairuosen  
       Jul 21, 2014
    传JSON呗
    forreal
        2
    forreal  
    OP
       Jul 21, 2014
    @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
       Jul 21, 2014
    @chairuosen
    难道是php可以python的flask不可以?
    chairuosen
        4
    chairuosen  
       Jul 21, 2014   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
       Jul 21, 2014
    难道真是flask的问题……
    timonwong
        6
    timonwong  
       Jul 21, 2014   1
    首先,你得确认你的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
        7
    forreal  
    OP
       Jul 21, 2014
    @chairuosen
    解决了,我在debug下看的request.form变量,可能是werkzeug的数据结构问题,在debug下只能看到reuqest.form的第一个值,但是调用request.form.getlist()能取到完整的数组。
    Hackathon
        8
    Hackathon  
       Jul 21, 2014   1
    还没看过flask
    Django是把post过来的数据放一份到request.body里
    有些复杂格式传递过来, request.GET, request.POST解析不了
    这时候你就去request.body里自己取出来解析就可以了
    forreal
        9
    forreal  
    OP
       Jul 21, 2014
    @timonwong
    请求头没改,用debug下观察request.form变量只能看到第一个值,但是其实都解析好了。
    正如你说的的得用request.form.getlist()。
    多谢。
    forreal
        10
    forreal  
    OP
       Jul 21, 2014
    @Hackathon
    解决了,django了解不多,但还是谢谢你。O(∩_∩)O
    C0VN
        11
    C0VN  
       Jul 21, 2014   1
    js 先 array.toString(),后端再 string.split() 不可以吗?
    xiaozhang
        12
    xiaozhang  
       Jul 21, 2014   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  
       Jul 21, 2014
    request.args()
    forreal
        14
    forreal  
    OP
       Jul 21, 2014
    @xavierskip
    可以,但是官方提供了方法,我就尽可能用官方的,array里的字符串如果有逗号,可能还要做特殊处理吧,没试过。
    forreal
        15
    forreal  
    OP
       Jul 21, 2014
    @xiaozhang
    原来Javascript里还有JSON.stringify()方法。
    我一直没找到Javascript的api文档。请问哪里有?(不是jquery的也不是微软的jscript的)
    Honwhy
        16
    Honwhy  
       Jul 21, 2014   1
    我和你说一个类似的吧
    我后端用的struts 2.x,前端用jQuery,用post同样不行
    用那种 { 'choices[]': [ "Jon", "Susan" ] }同样不行,后面也是用了
    $.ajax这种方式。
    forreal
        18
    forreal  
    OP
       Jul 22, 2014
    @Honwhy
    不了解struts2,我用jquery时,传的的字典{"ids":[1,2,3]},但是到了flask后请求体的key变为了"ids[]",不知道是jquery还是flask把"ids"变为"ids[]",所以取值时用"ids[]"就可以取出来,而用"ids"不可以。
    传json可以作为框架不支持取数组的备用方法。以后打算看一看spring mvc,不知道支不支持直接取数组。
    forreal
        19
    forreal  
    OP
       Jul 22, 2014
    @xiaozhang
    多谢
    Codelike
        20
    Codelike      Apr 25, 2018
    数组转成 json,来进行传递。
    About     Help     Advertise     Blog     API     FAQ     Solana     3099 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 14:20 PVG 22:20 LAX 07:20 JFK 10:20
    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