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/