Lyn*_*mon 9 python flask kendo-ui
我正在使用Python实现服务器端过滤以服务KendoUI的Grid组件.
我面临的问题是它默认生成的AJAX调用似乎与Flask的内置URL解析器和Python的urlparse模块不兼容.
这是我遇到问题的查询字符串类型的人为样本: a=b&c=d&foo[bar]=baz&foo[baz]=qis&foo[qis]=bar
这是我要去的结果:
{
'a': 'b',
'c': 'd',
'foo': {
'bar': 'baz',
'baz': 'qis',
'qis': bar'
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,request.args如果传递给Flask端点,这就是你从中得到的:
{
'a': 'b',
'c': 'd',
'foo[bar]': 'baz'
'foo[baz]': 'qis'
'foo[qis]': 'bar'
}
Run Code Online (Sandbox Code Playgroud)
更糟糕的是,在实践中,结构可以是几层深.您将列过滤foo到值等于的行的基本调用'bar'将产生以下内容:
{
'filter[logic]': 'and',
'filter[filters][0][value]': 'bar',
'filter[filters][0][field]': 'foo',
'filter[filters][0][operator]': 'eq'
}
Run Code Online (Sandbox Code Playgroud)
我检查了RFC,它要求查询字符串只包含"非分层"数据.虽然我认为它指的是URI所代表的对象,但我没有在规范中找到这种类型的数据结构.
我开始编写一个函数,它将获取params的字典并返回它们所代表的嵌套构造,但我很快就意识到这是一个细微的问题,而且肯定有人在那之前遇到过这个问题.
是否有人知道要么以我想要的方式解析这些参数的模块,要么是一种优雅的解析方法,我可能会忽略它?
我刚写了一个小函数来做到这一点:
from collections import defaultdict
import re
params = {
'a': 'b',
'c': 'd',
'foo[bar]': 'element1',
'foo[baz]': 'element2',
'foo[qis]': 'element3',
'foo[borfarglan][bofgl]': 'element4',
'foo[borfarglan][bafgl]': 'element5',
}
def split(string, brackets_on_first_result = False):
matches = re.split("[\[\]]+", string)
matches.remove('')
return matches
def mr_parse(params):
results = {}
for key in params:
if '[' in key:
key_list = split(key)
d = results
for partial_key in key_list[:-1]:
if partial_key not in d:
d[partial_key] = dict()
d = d[partial_key]
d[key_list[-1]] = params[key]
else:
results[key] = params[key]
return results
print mr_parse(params)
Run Code Online (Sandbox Code Playgroud)
这适用于任何嵌套级别.
| 归档时间: |
|
| 查看次数: |
3564 次 |
| 最近记录: |