标题
1.内置信号和自定义信号
链接: 官网链接
当前文件均为某个app下
1.apps.py: 将信号和回调函数绑定
from django.apps import AppConfig
from django.db.models.signals import post_save, post_delete
from django.core.signals import request_finished
class UserConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.user'
def ready(self):
from apps.user.models import User
from apps.user.signal import post_save_user, post_delete_user, request_finished_all, custom_signal, \
custom_signal_callback
post_save.connect(post_save_user, sender=User, weak=False, dispatch_uid='my_unique_identifier')
post_delete.connect(post_delete_user, sender=User, weak=False, dispatch_uid='my_unique_identifier')
request_finished.connect(request_finished_all, weak=False, dispatch_uid='my_unique_identifier')
custom_signal.connect(custom_signal_callback, weak=False, dispatch_uid='my_unique_identifier') # 自定义的信号
2.signal.py:定义回调函数
from django.dispatch import Signal
def post_save_user(sender, instance, **kwargs):
print(instance.id)
pass
def post_delete_user(sender, instance, **kwargs):
print(instance.id)
pass
def request_finished_all(sender, **kwargs):
print(f'当前是request_finished')
print(kwargs)
pass
def custom_signal_callback(sender, **kwargs):
print('自定义的信号')
pass
custom_signal = Signal(providing_args=['data']) # 自定义信号
3.views.py:执行
from apps.user.signal import custom_signal
custom_signal.send(sender='test', data={'a': 'aa'}) # 同步执行
custom_signal.send_robust(sender='test', data={'a': 'aa'}) # 同步执行
注:
send() 和 send_robust() 都返回一个元组对列表 [(receiver, response), … ],表示被调用的接收器函数及其响应值的列表。
send() 和 send_robust() 在处理接收器函数所引发异常的方式上有所不同。 send() 不捕获接收器引起的任何异常;它只是允许错误传播。因此,并非所有的接收器都会在出现错误时被通知信号。
send_robust() 捕获从 Python的 Exception 类派生的所有错误,并确保所有接收器都收到信号通知。如果发生错误,将在引发错误的接收器的元组对中返回错误实例。