预处理函数 Flask Restless

Posted

技术标签:

【中文标题】预处理函数 Flask Restless【英文标题】:Preprocess function Flask Restless 【发布时间】:2013-12-26 01:50:12 【问题描述】:

我正在尝试将 Ember.js 和 Flask Restless 结合起来,但在连接 JSON API 时遇到了困难。

问题是我需要按摩 JSON 以匹配 Ember 期望的客户端。

Ember 正在POST 上发送类似的内容:

u'todo': u'isCompleted': False, u'title': u'hello'

但 Flask Restless 期待这样的事情

'is_completed': False, 'title': u'hello'

我可以做到这一点,如下所示,但是由于 Flask Restless preproccesor 不接受返回参数,并且必须更改数据对象并创建一个包含我想要的新字典不起作用.所以我需要通过添加和删除我需要的键来笨拙地改变给定的数据字典。

有没有更好的解决方案可以轻松扩展到更复杂的模型?

def ember_formatter(result):
    for key in result.keys():
        if key != 'objects':
            del result[key]

    result['todos'] = result['objects']
    del result['objects']

def pre_ember_formatter(data=None, **kw):

    data['is_completed'] = data['todo']['isCompleted']
    data['title'] = data['todo']['title']
    del data['todo']

restless_manager.create_api(
    Todo,
    methods=['GET', 'POST', 'DELETE', 'PUT', 'PATCH'],
    url_prefix='/api',
    collection_name='todos',
    results_per_page=-1,
    postprocessors=
        'GET_MANY': [ember_formatter]
    ,
    preprocessors=
        'POST': [pre_ember_formatter],
    
)

【问题讨论】:

【参考方案1】:

我不能 100% 确定 restless api 与 django-rest-framework 的映射有多接近,但在您上面的示例中,DRF 适配器将开箱即用。

https://github.com/toranb/ember-data-django-rest-adapter

使用这种方法,您可以保持 JSON api 不变,只需插入新的客户端适配器

【讨论】:

【参考方案2】:

我会把这个交给托兰,因为他的方法最终导致了启蒙之路,但我想明确说明我是如何做到这一点的。

我发现在客户端,在 Ember 中进行所有这些更改实际上更容易。一般的想法是您需要更改从服务器传入的 JSON,并更改离开客户端的 JSON。

这一切都是在DS.RESTSerializer 类中完成的,如果你看一下,那里有关于如何做到这一点的示例,一旦你习惯了,Ember 的文档就很棒。

因此,要修改从服务器传入的 JSON,您需要修改 extractArray 和 extractSingle 函数。

要修改离开客户端的JSON,你想修改serialize和serializeIntoHash函数,很简单。

我认为在 Ember 中完成这一切是有意义的,因为您通常无法控制与之交谈的 API。

【讨论】:

以上是关于预处理函数 Flask Restless的主要内容,如果未能解决你的问题,请参考以下文章

在flask-restless的PATCH_MANY预处理器中search_params为空

有没有办法将参数传递给 Flask-Restless GET_SINGLE 预处理器?

使用flask-restless实现超媒体

带有mod_wsgi的flask-restless无法连接到MySQL服务器

无法导入 Flask-Restless

Flask-Restful 优于 Flask-Restless