django信号

什么是django的signal

Django内部包含了一位“信号调度员”:当某事件在框架内发生时,它可以通知到我们的应用程序。 简而言之,当event(事件)发生时,signals(信号)允许若干 senders(寄件人)通知一组 receivers(接收者)。这在我们多个独立的应用代码对同一事件的发生都感兴趣时,特别有用。 个人理解,django的signal可理解为django内部的钩子,当一个事件发生时,其他程序可对其作出相关反应,可通过signal来回调定义好的处理函数(receivers),从而更大程度的解耦我们的系统。   django 内部有些定义好的signal供我们使用: 模型相关:

  • pre_save 对象save前触发
  • post_save 对象save后触发
  • pre_delete 对象delete前触发
  • post_delete 对象delete后触发
  • m2m_changed ManyToManyField 字段更新后触发

请求相关:

  • request_started 一个request请求前触发
  • request_finished request请求后触发

如何使用signals

编写signals.py 文件。

# -*- coding: utf-8 -*-
from django.db.models.signals import post_delete,post_save
from django.dispatch import receiver
from .models import SaltKeyList,MinionList

# 在操作saltkey表的保存时候同时对minion管理表做创建或更新操作
@receiver(post_save,sender = SaltKeyList,dispatch_uid ="saltkey_list_post_save")
def create_minion_list(sender,instance,created,update_fields,*\*kwargs):
 	if created and instance.certification_status =='accepted':
 		update_values = {'minion_id':instance.minion_id,'minion_status':'在线','utime':time.strftime('%Y年%m月%d日 %X')}				     		MinionList.objects.update_or_create(minion_id=instance.minion_id,defaults=update_values)					

# 在操作saltkey表的删除时候同时对minion管理表做删除操作
@receiver(post_delete, sender=SaltKeyList, dispatch_uid="saltkey_list_post_delete")
def delete_minion_list(sender, instance, **kwargs):
	if instance.certification_status == 'accepted':
    	MinionList.objects.filter(minion_id=instance.minion_id).delete()

第二步,加载signal

myapp/__init__py

default_app_config = 'myapp.apps.MySendingAppConfig'

myapp/apps.py

from django.apps import AppConfig
class MyAppConfig(AppConfig):
    name = 'myapp'
    def ready(self):
        # signals are imported, so that they are defined and can be used
        import myapp.signals.handlers

django信号
http://www.jcwit.com/article/360/
作者
Carlos
发布于
2019年3月18日
许可协议