从 Flask-restless 读取数据的 POST 请求
Posted
技术标签:
【中文标题】从 Flask-restless 读取数据的 POST 请求【英文标题】:POST request to read data from Flask-restless 【发布时间】:2015-12-18 17:25:56 【问题描述】:我正在尝试使用 KendoUI 网格和 Flask-Restless Web 服务实现服务器端过滤。
我的数据源对象如下所示:
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. 如果#1 的答案是肯定的:如何将 data.filter 对象从 Kendo DataSource 传递到 Flask-Restless Web 服务?
我确实可以访问预处理器内部的 flask.reguest.args(如果是 GET 请求),但是,args 结构将嵌套对象表示为字符串键,例如:'q[filters][0][value]'很难解析。我希望有更好的方法。
谢谢!
【问题讨论】:
【参考方案1】:编辑 2 -
这将部分格式化来自 $.ajax 类型请求的数据,以便与 Flask-Restless 中的 GET 请求一起使用。您可以将其用于 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'
然后您只需使用built-ins 的某些功能将其操作为Restless Search Queries 的正确格式(根据规范)。
# 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'
然后可以作为query...
【讨论】:
我看不出这如何适用于我的场景。我的请求参数直接来自小部件,服务器端框架是 Flask-Restless。我想使用 post 请求传递查询参数以进行读取,而不是更新数据。 @Matej 抱歉,我更新了 Restless 而不是 Restful。看起来搜索格式语法可能是通过 Flask-Restless 使用 GET 最灵活的方法。 感谢您的回复。为了更清楚,我编辑了问题。问题不在于手动构建过滤器并发送请求,而是从 kendo.DataSource 引入过滤器并在 Flask-Restless 预处理器中操作它们。您能否回答上述两个问题中的任何一个? @Matej 我根据您的回复更新了答案Edit 2。 Edit - 2 是朝着正确方向的尝试。但是,flask.request.args 是一个 ImmutableDict: ImmutableMultiDict([('q[filters][2][filters][0][operator]', u'eq'), ('q[filters][2][ filters][0][value]', u'106')... 你是如何得到上面在 Edit-2 的第一个代码块中显示的输出的?请擦除其余的响应,只留下 Edit-仅该部分的 2 部分与问题相关。谢谢。以上是关于从 Flask-restless 读取数据的 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章
Flask-Restless 从 Flask-Sqlalchemy 转储十进制值
使用 Flask-Restless 配置 Flask-SQLAlchemy 以使用多个数据库