【问题标题】:How to do a custom insert inside a python-eve app如何在 python-eve 应用程序中进行自定义插入
【发布时间】:2014-03-18 22:08:18
【问题描述】:

我在 eve 应用程序中有一些自定义烧瓶方法,需要与 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

我的 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 资源并插入此数据的文档或源代码。

【问题讨论】:

    标签: python mongodb flask eve


    【解决方案1】:

    您是否查看过on_insert 钩子?来自文档:

    当文档即将存储在数据库中时,on_insert(resource, documents)on_insert_<resource>(documents) 事件都会被引发。 回调函数可以挂钩这些事件,以任意添加新字段或编辑现有字段on_insert 在每个正在更新的资源上引发,而on_insert_<resource><resource> 端点被 POST 请求命中时引发。在这两种情况下,仅当至少一个文档通过验证并将被插入时才会引发该事件。 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.driverthis example snippet

    【讨论】:

    • 谢谢!是否可以在同一个钩子期间更改正在写入的资源或写入多个资源?
    • 不。我猜,除非你直接使用数据驱动程序。
    • 是否可以远程使用 test_client 来实现@CarlYoungblood 的要求,对其他资源进行操作?
    • 你可能只是从你的回调函数中点击其他资源端点,使用请求或类似的东西。
    【解决方案2】:

    使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2020-12-03
      • 2017-03-15
      相关资源
      最近更新 更多