信号机制
Django的信号机制能够实现在应用程序中解耦特定事件的触发与响应逻辑,这种机制使得我们可以在某些特定操作发生时自动触发相关的处理函数,这篇笔记我们简单介绍Django的信号机制。
注:在Java领域的Spring也有类似的机制,称为事件(Event)机制,它们的功能和适用场景都类似,可以对比学习。
使用内置信号
Django框架内有很多内置信号,它们主要用于响应框架的生命周期事件,比如模型对象创建、更新、删除,以及请求开始、结束等,通过定义信号接收器我们可以在这些事件发生时自动触发相关的处理函数。下面例子工程中,我们新建了signals.py,其中编写我们的自定义信号处理逻辑,将信号相关函数统一放到某个代码文件或代码包并不是强制性的,只是这样便于维护。
|_ demo01 # APP子模块
|_ signals.py # 信号接收函数
|_ apps.py # 模块入口描述文件
demo01/signals.py
from django.core.signals import request_started
from django.dispatch import receiver
@receiver(request_started)
def log_request_start(sender, environ, **kwargs):
print('Request started.')
signals.py中,我们使用@receiver装饰器来定义信号接收器,@receiver装饰器接收一个信号作为参数,当该信号触发时,会自动调用被装饰的函数。具体接收信号的函数的参数列表可以参考Django官方文档。
demo01/apps.py
from django.apps import AppConfig
class Demo01Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'demo01'
def ready(self):
import demo01.signals
APP子模块的apps.py中,我们手动在ready()函数中引入了signals.py,这样当Django启动时,会自动加载signals.py中的信号接收器。
注意:实际开发中,信号其实较少使用,因为Django提供了其它机制如中间件等已经可以满足大部分需求,大量使用信号接收器函数其实并不利于后期维护,因此不要乱用信号机制。
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。