django进阶(十二)之信号
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
相当于我们创建了一个hook。
内置信号
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 connection_created # 创建数据库连接时,自动触发
示例
#!/usr/bin/env python #-*- coding:utf-8 -*- 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 test_singal(sender, **kwargs): print("test_singal_function") #print(sender,kwargs) request_started.connect(test_singal) # request_started 指上述导入的内容,test_singal为函数名
首先加载到内存(也可以在views里导入)


视图函数views.py

由上图执行结果看到,测试成功(表示在执行构造方法之前进行调用)
数据库由专门的数据库信号,详细看上面内置信号
自定义信号
想要发送信号,必须先要创建一个信号,在django中,信号是django.dispatch.Signal类的实例,该类的构造函数接受一个名叫providing_args参数,该参数是参数名列表,举例如下:
import django.dispatch game_start = django.dispatch.Signal(providing_args=['player', 'level']) 有了信号,我们要确定信号是谁发送出去的,这个时候就要用到“`Signal.send(sender, **kwargs)方法了.代码示例如下: class Game(object): def start(self, user, level): game_start.send(sender=self.__class__, player=user, level=level)
自定义信号流程
- 首先建一个python文件,定义一个信号,用于创建自定义信号名称及相关函数
- views里导入文件,触发信号
- 执行
示例
import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])##红色为触发者在触发信号的时候传入的参数 def custom_singal(sender, **kwargs): print("test_custom_singal") print(sender, kwargs) pizza_done.connect(custom_singal)

视图函数views.py
from singal_test import pizza_done def cache(request): ctime = time.time() pizza_done.send(sender="sendd", toppings="toppings", size='123') ###触发信号,这里参数要与创建信号时的参数相同 print (ctime) #return render(request,'cache.html',{'ctime':ctime}) return HttpResponse('ok')


浙公网安备 33010602011771号