解码用python / flask中的jquery' $ .param()序列化的嵌套对象

时间:2017-03-17 10:06:01

标签: javascript jquery python flask

Jquery的param允许您编码嵌套对象以通过get参数传输:

$.param({ a: [ 2, 3, 4 ] }); // "a=2&a=3&a=4"
// >=1.4:
$.param({ a: [ 2, 3, 4 ] }); // "a[]=2&a[]=3&a[]=4"

// <=1.3.2:
$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] });
// "a=[object+Object]&d=3&d=4&d=[object+Object]"

// >=1.4:
$.param({ a: { b: 1, c: 2 }, d: [ 3, 4, { e: 5 } ] });
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5"

如何在Python中解码这个列表/字典?作为替代方案,是否有任何其他序列化适用于在Javascript和Python中实现的嵌套对象?

2 个答案:

答案 0 :(得分:1)

对于列表中的简单值,例如$.param({ a: [ 2, 3, 4 ] }),请使用request.args.getlist("a[]")

对于$.param({d:{foo:123, bar:456}}),请使用:

def get_jquery_dict(args, key):
    needle = re.compile(r"^{}\[(\w+)\](.*)$".format(key))
    d = MultiDict()
    for k, v in args.items(multi=True):
        m = needle.match(k)
        if not m:
            continue
        key = m.group(1) + m.group(2)
        d.add(key, v)
    return d

get_jquery_dict(request.args, 'd')

哪个适用于dicts中的dict($.param({outer:{inner:{foo: 123, bar:456}}})):

# ?outer[inner][foo]=123&outer[inner][bar]=456
outer = get_jquery_dict(request.args, 'outer')
inner = get_jquery_dict(outer, 'inner')

并在dicts($.param({foo: {bar: [10,20,30]}}))中列出:

# ?foo[bar][]=10&foo[bar][]=20&foo[bar][]=30
foo = get_jquery_dict(request.args, 'foo')
bar = foo.getlist('bar[]')

对于列表中的词典([3, 4, { e: 5 }]),欢迎您调整上面的代码并创建get_jquery_list()函数,或稍微修改您的数据结构以避免它们: - )

答案 1 :(得分:0)

您可以将其序列化为JSON,然后使用json python模块来读取数据。这将把它放在字典中。

你可以serialize to JSON

在Javascript中:

var JSON.stringify(your_data);

在Python中阅读JSON:

import json    

s = json.loads('{ "a": { "b": 1, "c": 2 }, "d": [ 3, 4, { "e": 5 } ] }')
s['a']
>>>> {'b': 1, 'c': 2}

s['a']['b']
>>>> 1

使用回答here的Flask示例,您可能需要更改query_string参数,但它会了解它的工作方式:

from flask import Flask, request
from urllib import unquote
import json

app = Flask(__name__)

@app.route('/test', methods=['GET'])
def process_data():
    data = json.loads(unquote(request.query_string.partition('&')[0]))
    ...

if __name__ == "__main__":
    app.run()

如果您可以发送POST而不是GET,则可以将数据指定为JSON,并直接从Python / Flask中的request.json读取。