如何在 python eve 中存储到数据库之前处理数据

Posted

技术标签:

【中文标题】如何在 python eve 中存储到数据库之前处理数据【英文标题】:How to process data before storing to database in python eve 【发布时间】:2017-11-09 20:25:32 【问题描述】:

我目前正在学习 python eve 框架和 mongoDB 数据库,用于 restful API 开发。在 eve 中,基本的 CRUD 操作仅通过在 settings.py 文件中定义模式来完成。客户端可以发送 GET/POST 方法,数据会根据预定义的 schema 自动存储到 mongoDB 中。

如果我想在将数据插入 mongoDB 之前对其进行预处理(例如:客户端仅发送产品数量和价格,然后服务器计算总金额并将产品、价格和金额存储到数据库中)。如果我想在响应客户之前处理我的数据怎么办。我们是否应该使用烧瓶控制器方法(例如EVE - define custom flask controllers)并手动将数据存储到数据库中?

【问题讨论】:

【参考方案1】:

你在这里问两件事。

首先,如果您想在响应 GET 请求之前操作已经存储的数据,您需要的是 on_fetched_resource_<resource_name>on_fetched_item_<resource_name> 数据库事件挂钩。您可以在返回之前将所需的信息添加到响应中:

当执行了 GET、POST、PATCH、PUT、DELETE 方法时,会引发 on_post_ 和 on_post__ 事件。您可以使用多个回调函数订阅这些事件。回调将接收访问的资源、原始 flask.request 对象和响应负载。

def post_get_callback(resource, request, payload):
    print('A GET on the "%s" endpoint was just performed!' % resource)

def post_contacts_get_callback(request, payload):
    print('A get on "contacts" was just performed!')

app = Eve()

app.on_post_GET += post_get_callback
app.on_post_GET_contacts += post_contacts_get_callback

app.run()    

在此处查看文档:http://python-eve.org/features.html#post-request-event-hooks

但是,如果您想在存储到数据库之前处理 POST 数据,您需要一个 on_insert_<resource_name> 数据库事件挂钩。您可以在将资源保存到数据库之前将所需的信息添加到资源中:

数据库事件挂钩的工作方式类似于请求事件挂钩。这些事件在数据库操作之前和之后触发。以下是如何配置事件的示例:

def add_sum(items):
    for item in items:
        item['sum'] = item['a'] + item['b']

app = Eve()
app.on_insert_item += add_sum

【讨论】:

非常感谢。这正是我想要的。

以上是关于如何在 python eve 中存储到数据库之前处理数据的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中处理货币值的最佳实践?

7.EVE-NG硬盘扩容,存储海量镜像

python 使用Oracle数据库的Eve REST API

安装个EVE磁盘要多大的空间?

我的eve为何登录不了?一直是下面的页面。而且进程也没有变化

python包eve的异常行为