信号
lightning 提供了四个signal,主要是对Model的增删改操作前后发出,开发者可以在pre_*
类的signal响应中做一些前置校验性的逻辑,开post_*
类的signal中做一些补充的逻辑。
这几个signal和 Django的 pre_save
、post_save
、pre_delete
、pre_delete
类似,需要根据开发者自己的场景来决定使用哪个signal,如果是想对lightning管理后台及lightning api对数据的增删改进行扩展,可以使用lightning的signal,如果面向其他更多的操作途径,可以考虑使用Django内置的signal。
signal代码建议写在应用目录的signals.py文件中或其他会被自动加载的源码文件中如admin.py, mode.py。
示例:
#
pre_lightning_createmodel实例保存前发出该signal,处理函数需要接受以下参数:
- sender, 信号发送者,即Model
- instance, 待保存的数据,格式为dict,外键及多对多的属性己预加载为django数据对象。该数据仅用于进一步校验,不能做修改,以免造成未知问題。
- create, 是否创建操作,False时为更新操作。
- request, 当前的Django请求
- old_instance, 当create为False,即更新时,会提供旧对象
#
post_lightning_createmodel实例保存后发出该signal,处理函数需要接受以下参数:
- sender, 信号发送者,即Model
- instance,已保存的Model实例,此时可以对该实例进行二次操作及保存等。如果使用django的
post_save
,在处理函数中作二次保存,会导致无限循环,使用lightning的signal则没有问題。 - create, 是否创建操作,False时为更新操作。
- request, 当前的Django请求。
- old_instance, 当create为False,即更新时,会提供旧对象
请注意,如果处理函数发生了异常没有捕捉,会导致当前数据库的操作回滚,所以,请开发者根据自己的使用场景决定是否需要进行异常捕捉。
#
pre_lightning_deletemodel实例被删除前发出该信号,信号处理函数可进行前置校验或阻止删除(抛出异常即可),函数接受以下参数:
- sender, 信号发送者,即Model
- instance, 将要被删除的model实例副本,仅供前端校验用,不要对该instace做保存或修改操作,否则会出现数据重复或其他未知错误。
- request, 当前的Django请求。
#
post_lightning_deletemodel实例被删除后发出该信号,信号处理函数可进行后续的清理工作,函数接受以下参数:
- sender, 信号发送者,即Model
- instance, 已被删除的model实例副本,仅供前端校验用,不要对该instace做保存或修改操作,否则会出现数据重复或其他未知错误。
- request, 当前的Django请求。
#
注意事项- 以上siangl均在单条数据的增删改操作时有效,批量操作时不会触发。
- 请注意,如果处理函数发生了异常没有捕捉,会导致当前数据库的操作回滚,所以,请开发者根据自己的使用场景决定是否需要进行异常捕捉。