MongoEngine – 信号
信号是由一个发送者对象发出的事件,任何数量的接收者对象都可以订阅这样的事件。一个信号接收器可以订阅一个特定的发送者,也可以接收来自许多发送者的信号。
在MongoEngine中,信号处理由blinker库支持,这意味着你需要使用pip工具安装它。mongoengine.signals模块有以下信号的定义 –
pre_init | 在创建一个新的Document或EmbeddedDocument实例时被调用,并在构造参数被收集后但在对其进行任何额外处理之前被执行。 |
---|---|
post_init | 在对一个新的Document或EmbeddedDocument实例的所有处理完成后被调用。 |
pre_save | 在执行任何操作之前,在save()中调用。 |
pre_save_post_validation | 在save()中,在验证发生后但在保存前调用。 |
post_save | 在大多数操作(验证、插入/更新)成功完成后,在save()中调用。一个额外的布尔关键字参数被传递,以表明该保存是一个插入或更新。 |
pre_delete | 在试图进行删除操作之前,在delete()中调用。 |
post_delete | 在成功删除记录时,在delete()中调用。 |
pre_bulk_insert | 在验证了要插入的文件后,但在写入任何数据之前调用。 |
post_bulk_insert | 在一个成功的批量插入操作后调用。一个额外的布尔参数,加载,确定文档的内容,当真时是文档实例,如果假时是插入记录的主键值列表。 |
然后一个事件处理函数被附加到Document类。注意, EmbeddedDocument 只支持pre/post_init信号。pre/post_save等,应该只附加到Document的类上。
你也可以使用装饰器来快速创建一些信号,并将它们作为类装饰器附加到你的Document或EmbeddedDocument子类中。
在下面的例子中,作为信号处理程序的演示,我们也使用了Python的标准库模块–日志,并将日志级别设置为调试。
然后我们写一个文档类,以便在newdb数据库中创建相应的集合。在这个类中,定义了两个类的方法pre_save()和post_save(),目的是在文档被保存在Author集合中之前和之后被调用。
这两个类方法都是用类名、发送者对象和文档的参数来定义的,并带有可选的关键字参数列表。
最后,我们注册信号处理程序。
当我们创建一个Document子类的实例时,控制台日志将显示预存和后存信号被各自的事件处理程序所处理。
Python控制台报告的日志如下所示 –