预处理功能Flask Restless

时间:2013-12-09 03:02:38

标签: python json ember.js flask flask-restless

我正在尝试将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不接受return参数,并且数据对象必须在适当的位置更改并创建包含我想要的内容的新dict将无法工作。所以我需要通过添加和删除我需要的密钥来笨拙地改变给定的数据字典。

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

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],
    }
)

2 个答案:

答案 0 :(得分:0)

我不是100%确定不安分的api与django-rest-framework有多接近,但在上面的示例中,DRF适配器可以开箱即用。

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

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

即可

答案 1 :(得分:0)

我会把这个给Toran,因为他的方法最终导致了启蒙的道路,但是想明确我是如何做到的。

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

这一切都在DS.RESTSerializer课程中完成,如果你看一下,有关如何做到这一点的例子,一旦你习惯了,Ember的文档很棒。

因此,要修改来自服务器的JSON,您需要修改extractArray和extractSingle函数。

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

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