修改Flask-Restless的JSON响应
我正在尝试将Flask-Restless和Ember.js结合使用,但进展不太顺利。让我困惑的是GET请求的响应。例如,当我对/api/people
进行GET
请求时,Ember.js期望得到:
{
people: [
{ id: 1, name: "Yehuda Katz" }
]
}
但是Flask-Restless的响应是:
{
"total_pages": 1,
"objects": [
{ "id": 1, "name": "Yahuda Katz" }
],
"num_results": 1,
"page": 1
}
我该如何修改Flask-Restless的响应,使其符合Ember.js的要求呢?我觉得这可能和一个后处理函数有关,但我不太确定该怎么实现。
2 个回答
10
Flask的扩展有很容易理解的源代码。你可以创建一个叫做 GET_MANY
的后处理器:
def pagination_remover(results):
return {'people': results['objects']} if 'page' in results else results
manager.create_api(
...,
postprocessors={
'GET_MANY': [pagination_remover]
}
)
我还没有测试过,但应该是可以用的。
4
之前的答案在当时是正确的。不过,现在在Flask-Restless中,处理请求的前置和后置程序的工作方式发生了变化。根据文档的说明:
每种请求的前置程序和后置程序接受不同的参数,但它们都没有返回值(更具体地说,返回的值会被忽略)。前置程序和后置程序会直接修改它们的参数。
所以现在在我的后置程序中,我只需删除我不想要的任何键。例如:
def api_post_get_many(result=None, **kw):
for key in result.keys():
if key != 'objects':
del result[key]