V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
forreal
V2EX  ›  程序员

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

  •  
  •   forreal · 2014-07-21 19:03:38 +08:00 · 18107 次点击
    这是一个创建于 3571 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用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.form.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   ·   我们的愿景   ·   实用小工具   ·   2260 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:35 · PVG 14:35 · LAX 23:35 · JFK 02:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.