MongoEngine – 信号

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的标准库模块–日志,并将日志级别设置为调试。

from mongoengine import *
from mongoengine import signals
import logging
logging.basicConfig(level=logging.DEBUG)

然后我们写一个文档类,以便在newdb数据库中创建相应的集合。在这个类中,定义了两个类的方法pre_save()和post_save(),目的是在文档被保存在Author集合中之前和之后被调用。

class Author(Document):
   name = StringField()

   def __unicode__(self):
      return self.name

   @classmethod
   def pre_save(cls, sender, document, **kwargs):
      logging.debug("Pre Save: %s" % document.name)

   @classmethod
   def post_save(cls, sender, document, **kwargs):
      logging.debug("Post Save: %s" % document.name)
      if 'created' in kwargs:
         if kwargs['created']:
            logging.debug("Created")
         else:
            logging.debug("Updated")

这两个类方法都是用类名、发送者对象和文档的参数来定义的,并带有可选的关键字参数列表。

最后,我们注册信号处理程序。

signals.pre_save.connect(Author.pre_save, sender=Author)
signals.post_save.connect(Author.post_save, sender=Author)

当我们创建一个Document子类的实例时,控制台日志将显示预存和后存信号被各自的事件处理程序所处理。

Author(name="Lathkar").save()

Python控制台报告的日志如下所示 –

DEBUG:root:Pre Save: Lathkar
DEBUG:root:Post Save: Lathkar
DEBUG:root:Created

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程