修改Flask-Restless的JSON响应

8 投票
2 回答
2685 浏览
提问于 2025-04-17 19:16

我正在尝试将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]

撰写回答