【django】信号

信号

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

Django内置信号

Model相关信号

  • 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相关信号

  • pre_migrate:执行migrate命令前,自动触发
  • post_migrate:执行migrate命令后,自动触发

请求相关信号

  • request_started:请求到来前,自动触发
  • request_finished:请求结束后,自动触发
  • got_request_exception:请求异常后,自动触发

Test相关信号

  • setting_changed:使用test测试修改配置文件时,自动触发
  • template_rendered:使用test测试渲染模板时,自动触发

Database相关信号

  • connection_created:创建数据库连接时,自动触发

使用内置信号

想要使用Django的内置信号只需要注册指定信号即可,当程序触发相应操作自动触发注册函数

在项目中可以在项目下的init文件中、app下的init中、app下的views中。

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):
    # sender:信号触发者
    print("callback")
    print(sender,kwargs)
    
post_save.connect(callback)

views.py

import random
def login(sender,**kwargs):
    models.Id.objects.create(id=random.randint(1,10000), name="name1")
    return HttpResponse("200")

打印结果:

callback
<class 'app1.models.Id'> {'signal': <django.db.models.signals.ModelSignal object at 0x03226A70>, 'instance': <Id: Id object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

自定义信号

除了django内置的信号外,还支持我们进行自定义信号

定义信号:

信号可以定义在py文件、项目下的init文件、应用的init文件中

import django.dispatch

# 自定义一个pizza_done的信号
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
#toppings,size参数名称可以自定义

# 信号触发时执行的函数
def callback(sender, **kwargs):
    print("callback")
    print(sender, kwargs)
# 注册信号
pizza_done.connect(callback)

触发信号:

自定义信号需要手动进行触发

# 导入自定义信号
from signals import pizza_done
def index(request):
	# 触发自定义信号
    pizza_done.send(sender='index', toppings=1, size=2)
    # sender触发者
    # toppings、size定义信号时指定的参数
    return render(request,"index.html")

结果:

callback
index {'signal': <django.dispatch.dispatcher.Signal object at 0x04025790>, 'toppings': 1, 'size': 2}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章