Python-Eve:在插入到数据库之前使用预先请求事件挂钩修改数据
问题描述:
我在我的eve-API上通过POST请求向数据库添加新数据。 由于需要从Python端添加一些数据,我以为我可以通过使用pre-request event hook来添加这些数据。Python-Eve:在插入到数据库之前使用预先请求事件挂钩修改数据
那么在将数据插入数据库之前,有没有办法使用预请求钩子修改POST请求中包含的数据?我已经理解了如何实现这样一个钩子,但没有任何关于在插入到数据库之前如何修改数据的线索。
答
你可能想看看database hooks,特别是在insert hooks:
当POST请求命中API和新项目都将被存储在数据库中,这些通风口被解雇:
针对每个资源端点的
on_insert
。
on_insert_<resource_name>
针对特定资源端点。回调函数可能会挂钩到这些事件中以任意添加新字段或编辑现有字段。
在下面的代码:
def before_insert(resource_name, documents):
if resource_name == 'myresource':
for document in documents:
document['field'] = 'value'
app = Eve()
app.on_insert += before_insert
app.run()
每次POST打before_insert
函数被调用的API。该功能为每个文档更新field1
。由于在将有效载荷发送到数据库之前调用此回调,所以更改将持久保存到数据库。
一个有趣的选择是:
def before_insert(resource_name, documents):
for document in documents:
document['field'] = 'value'
app = Eve()
app.on_insert_myresource += before_insert
app.run()
在回调,我们不再被测试的端点名称。这是因为我们将回调挂钩到on_insert_myresoure
事件,因此只有在myresource
端点上执行POST请求时才会调用该函数。更好地分离问题,代码更简单,而且性能也得到提高,因为回调不会受到全部 API插入的影响。注意,最终您可以将多个回调挂钩到相同的事件(因此使用添加运算符+=
)。
看起来这个钩子在验证过程之后被调用。那么是否有一种方法可以将此与验证结合起来,因为必填字段仍在提高'required_field'错误? – albert
如果这些字段是必需的,并且它们缺少验证,并且文档被拒绝。在插入之前和验证之后挂钩发生火灾。你不能简单地让这些字段不需要吗?或者,您可以自定义验证器以不同方式处理'required'规则,或者更好地添加对不同规则的支持(请参阅文档中的“自定义验证”)。 –