django的信号机制
django提供的信号机制可以在框架触发特定的条件发生前后执行提前定义好的函数
常见的内置的信号有
-
模型信号
pre_init # Django中的model对象执行其构造方法前,自动触发 post_init # Django中的model对象执行其构造方法后,自动触发 pre_save # Django中的model对象保存前,自动触发 post_save # Django中的model对象保存后,自动触发 pre_delete # Django中的model对象删除前,自动触发 post_delete # Django中的model对象删除后,自动触发 m2m_changed # Django中的model对象使用m2m字段操作数据库的第三张表
-
请求、响应的信号
request_started # 请求到来前,自动触发 request_finished # 请求结束后,自动触发 got_request_exception # 请求异常时,自动触发
-
数据库迁移信号
pre_migrate # 执行migrate命令前,自动触发 post_migrate # 执行migrate命令后,自动触发
更多信号可以参考官方文档
信号的使用
from django.db.models import signals
from django.dispatch import receiver
@receiver(signals.post_save)
def signals_callback(sender, **kwargs):
print(sender)
print(kwargs)
使用django的receiver装饰器,装饰器接受一个信号类别的函数对象
sender为装饰器接受的对应信号类别对象所指定的类型
只要在项目加载过程中能够加载到这个信号所在的文件就可以完成信号的注册
一般放在特定app的__init__文件夹下
自定义信号
创建信号
from django.db.models import signals
from django.core.signals import request_started
from django.dispatch import receiver, Signal
# @receiver(signals.post_save)
# def signals_callback(sender, **kwargs):
# print(sender)
# print(kwargs)
send_email_signal = Signal(providing_args=['username', 'email', 'message'])
@receiver(send_email_signal)
def send_email(sender, username, email, message, **kwargs):
print(sender)
print(username)
print(email)
print(message)
调用信号
from django.http import HttpResponse
from . import models
from . import send_email_signal
# Create your views here.
def index(request):
send_email_signal.send(sender="sender", username="ivy", email="email", message="message")
return HttpResponse("ok")