Python Web开发:信号触发器

来自CloudWiki
跳转至: 导航搜索

背景

介绍如何利用Django信号机制实现触发效果:

当招聘人员修改简历的status字段时(未审/通过/未通过)时触发额外操作,

灵活使用django内置的模型信号 就可以监控大部分模型对象的变化,并且不需要修改原模型的代码。

代码

编辑models.py文件,添加代码:

@receiver(post_init, sender=Resume)
def before_save_resume(sender, instance, **kwargs):
    instance.__original_status = instance.status


@receiver(post_save, sender=Resume)
def post_save_resume(sender, instance, **kwargs):
    print(instance.__original_status)
    print(instance.status)

  • 引入自带的模型信号post_init和post_save,post_init表示在管理员单击“保存”按钮前触发信号,post_save表示在单击保存按钮后触发信号)
  • 信号的接收采用装饰器@receiver来实现,第一个参数表示信号类型,第二个是需要监控的模型类。
  • 对于两个不同的信号,分别采用两个不同的函数来相应,第一个函数 用于保存初始值,第二个函数用于打印前后两个值,说明管理员对status状态的更改可以有效的监控到。

效果图

Python21052804.png

后台打印:

[28/May/2021 23:44:12] "GET /admin/contactApp/resume/2/change/ HTTP/1.1" 200 11133
[28/May/2021 23:45:04] "GET /admin/jsi18n/ HTTP/1.1" 200 7722
2
1