我在前夕应用程序中有一些自定义方法需要与telnet设备通信并返回结果,但我还想在从此telnet设备检索数据后将数据预先填充到某些资源中,如下所示: / p>
@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
我的settings.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资源的文档或源代码并插入此数据。
答案 0 :(得分:5)
你有没看过on_insert
钩子?来自文档:
当文档即将存储在数据库中时,会引发
on_insert(resource, documents)
和on_insert_<resource>(documents)
个事件。 回调函数可以挂钩这些事件,以便随意添加新字段或编辑现有字段。当on_insert
端点被POST请求命中时,on_insert_<resource>
被引发时,会在每个正在更新的资源上引发<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
中的{{1}}。
答案 1 :(得分:0)
使用 post_internal
用法example:
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)