我正在尝试使用KendoUI网格和Flask-Restless web service实现服务器端过滤。
我的数据源对象是这样的:
var myDataSource = new kendo.data.DataSource({
transport: {
read: {
type: 'GET',
url: "http://localhost:5000/api/geo",
contentType: "application/json",
dataType: "json",
},
parameterMap: function(data, type) {
if (type == "read") {
// console.log(data.filter);
return {
page: data.page,
q: data.filter
}
}
},
},
schema: {
data: 'objects',
total: "num_results",
},
serverPaging: true,
serverFiltering: true,
pageSize: 100,
});
在服务器端,我想拦截过滤参数,适当地修改它们以适应Flask-Restless查询对象格式,并将它们传递给REST端点。但是,如果使用GET请求,flask.request.args对象看起来像一个平坦的字典,解析起来很繁琐。预处理器中的以下代码:
for key, value in flask.request.args.iteritems():
print '%s : %s' % (key, value)
生产:
q[filters][0][value] : 106
q[filters][1][field] : county_id
q[filters][1][operator] : eq
q[filters][1][value] : 107
q[filters][0][operator] : eq
q[filters][0][field] : county_id
q[logic] : and
我想我有两个问题:1. 是否可以使用POST请求从Flask-Restless端点读取数据?2. 如果第一个问题的答案是肯定的:如何传递数据。从剑道数据源到Flask-Restless web服务的过滤器对象?我确实可以访问预处理器内部的flask.reguest.args(在GET请求的情况下),然而,args结构将嵌套对象表示为字符串键,如:'q[filters][0][value]',这很难解析。我希望有更好的办法。
谢谢!
EDIT 2 -
这将部分地格式化$中的数据。在Flask-Restless中与GET请求一起使用的ajax类型请求。您可以将其用于GET(如您在上面的示例中使用的),而不需要使用POST。希望这能有所帮助,如果没有,那么你就需要提供更多的数据或尝试来帮助引导正确的方向。此外,操作仍然需要几个步骤(即逻辑)来进行转换。我认为这将是一个很好的练习来完成……
如果你输出flask.request.args
,你应该得到这样的结果:
import pprint
pprint(q)
# returns this
{'filters': [{'field': 'county_id', 'operator': 'eq', 'value': 106},
{'field': 'county_id', 'operator': 'eq', 'value': 107}],'logic':'and'}
然后你只需要使用内置的一些功能来操作它到不宁搜索查询的正确格式(根据规格)。
# Python 3
new_filter = {}
for key, value in q.items():
if key == 'filters':
new_filter[key] = []
for item in q[key]:
rename_data = {
'name': item['field'] ,
'op': item['operator'],
'val': item['value']
}
new_filter[key].append(rename_data)
else:
new_filter[key] = value
返回……
{'filters': [{'name': 'county_id', 'op': 'eq', 'val': 106},
{'name': 'county_id', 'op': 'eq', 'val': 107}],
'logic': 'and'}