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中实现的嵌套对象?
答案 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模块来读取数据。这将把它放在字典中。
在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
读取。