如何在python eve应用程序中进行自定义插入



我在eve应用程序中有一些自定义的flask方法,需要与telnet设备通信并返回结果,但我也想在从这个telnet设备检索数据后将数据预填充到一些资源中,比如:

@app.route("/get_vlan_description", methods=['POST'])
def get_vlan_description():
switch = prepare_switch(request)
result = dispatch_switch_command(switch, 'get_vlan_description')
# TODO: populate vlans resource with result data and return status

我的设置.py看起来像这样:

SERVER_NAME = '127.0.0.1:5000'
DOMAIN = {
'vlans': {
'id': {
'type': 'integer',
'required': True,
'unique': True
},
'subnet': {
'type': 'string',
'required': True
},
'description': {
'type': 'boolean',
'default': False
}
}
}

我很难找到如何直接访问mongo资源并插入这些数据的文档或源代码。

您查看过on_insert挂钩吗?来自文件:

当文档即将存储在数据库中时,会引发on_insert(resource, documents)on_insert_<resource>(documents)事件回调函数可以挂接到这些事件中,任意添加新字段或编辑现有字段。在每个正在更新的资源上引发on_insert,而在<resource>端点被POST请求击中时引发on_insert_<resource>。在这两种情况下,只有当至少有一个文档通过验证并将被插入时,才会引发事件。documents是一个列表,仅包含准备插入的文档(未通过验证的有效负载文档不包括在内)

所以,如果我得到了你想要实现的目标,你可以拥有这样的东西:

def telnet_service(resource, documents):
""" 
fetch data from telnet device;
update 'documents' accordingly 
"""
pass
app = Eve()
app.on_insert += telnet_service
if __name__ == "__main__":
app.run()

请注意,通过这种方式,您不必直接处理数据库,因为Eve会处理这些问题。

如果您不想存储telnet数据,而只想将其与提取的文档一起发送回,则可以挂接到on_fetch

最后,如果您真的想使用数据层,可以使用app.data.driver,如本示例片段所示。

使用post_internal

用法示例:

from run import app
from eve.methods.post import post_internal
payload = {
"firstname": "Ray",
"lastname": "LaMontagne",
"role": ["contributor"]
}
with app.test_request_context():
x = post_internal('people', payload)
print(x)

最新更新