我目前正在学习python eve框架和mongoDB数据库,以进行宁静的API开发。在前夕,基本的CRUD操作只能通过在settings.py
文件中定义模式来完成。客户端可以发送GET / POST方法,并根据预定义的模式将数据自动存储到mongoDB中。
如果我想在将数据插入mongoDB之前对其进行预处理(例如:客户端只发送产品数量和价格,然后服务器计算总数量并将产品,价格和数量存储到数据库中),该怎么办?如果我想在响应客户端之前处理我的数据,该怎么办?我们应该使用烧瓶控制器方法(如此EVE - define custom flask controllers)并手动将数据存储到数据库吗?
答案 0 :(得分:4)
你在这里问两件事。
首先,如果您想在响应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