"Django 中提供了" 信号调度 ", 用于在框架执行操作时解耦.
通俗来讲, 就是在某些动作发生时, 信号允许特定的发送者去提醒一些接受者.
Django 内置信号:
- Model signals
- 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 字段操作第三张表 (add,remove,clear) 前后, 自动触发
- class_prepared # 程序启动时, 检测已注册的 App 中 modal 类, 对于每一个类, 自动触发
- Management signals
- pre_migrate # 执行 migrate 命令前, 自动触发
- post_migrate # 执行 migrate 命令后, 自动触发
- Request/response signals
- request_started # 请求到来前, 自动触发
- request_finished # 请求结束后, 自动触发
- got_request_exception # 请求异常后, 自动触发
- Test signals
- setting_changed # 使用 test 测试修改配置文件时, 自动触发
- template_rendered # 使用 test 测试渲染模板时, 自动触发
- Database Wrappers
对于 Django 内置的信号, 仅需注册指定信号, 当程序执行相应操作时, 会自动触发注册的函数.
注册信号, 将如下内容写入与 project 同名的文件夹下的__init__.py 文件中.
- from django.core.signals import request_finished
- from django.core.signals import request_started
- from django.core.signals import got_request_exception
- from django.db.models.signals import class_prepared
- from django.db.models.signals import pre_init, post_init
- from django.db.models.signals import pre_save, post_save
- from django.db.models.signals import pre_delete, post_delete
- from django.db.models.signals import m2m_changed
- from django.db.models.signals import pre_migrate, post_migrate
- from django.test.signals import setting_changed
- from django.test.signals import template_rendered
- from django.db.backends.signals import connection_created
- def callback(sender, **kwargs):
- print("xxoo_callback")
- print(sender,kwargs)
- xxoo.connect(callback)
- # xxoo 指上述导入的内容
内置信号示例:
- from django.db.models.signals import pre_save, post_save
- # pre_save --> django 的 model 执行其构造方法前, 自动触发
- # post_save --> django 的 model 执行其构造方法后, 自动触发
- from django.dispatch import receiver # 用于调用信号的装饰器
- # 方法一: 信号指定函数
- def callback01(sender, **kwargs):
- print('xxoo_callback01')
- print(sender, kwargs)
- pre_save.connect(callback01)
- # 方法二: 利用装饰器调用信号
- @receiver(post_save)
- def callback02(sender, **kwargs):
- print('xxoo_callback02')
- print(sender, kwargs)
自定义信号:
==1, 先在某 py 文件中定义信号:==
- """自定义信号 (不常用)"""
- import django.dispatch
- pizza_done = django.dispatch.Signal(providing_args=['toppings', 'size'])
==2, 然后在 project 下的__init__.py 文件中注册信号:==
- from django.dispatch import receiver # 用于调用信号的装饰器
- from my_signals import pizza_done # 导入自定义信号
- # 方式三: 调用自定义信号
- @receiver(pizza_done)
- def my_callback(sender, **kwargs):
- print('xxoo_my_callback')
- print(sender, kwargs)
==3, 最后在 views 文件下函数中触发信号:==
- from my_signals import pizza_done # 导入自定义信号
- def post(request):
- models.User.objects.create(name='zyk03', sex="男")
- pizza_done.send(sender='seven', toppings='abc', size='123') # 此步骤将触发自定义信号
- return HttpResponse('is ok')
因为内置信号的触发者是集成到 Django 中的, 所以会自动调用.
而对于自定义信号则需要开发者在任意位置触发.
"
来源: http://www.bubuko.com/infodetail-3159202.html