前言

Django的信号要从一张抽象图和一个需求说起;

Django之信号和序列化

赛道:Django

赛车:http请求

基础设施:Django设置的信号

 

一、Django内置信号类型

1、既然赛道上有各种基础设置,那么Django里面又内置了哪些信号呢?

 

Model signals
    pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用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 # 创建数据库连接时,自动触发

 

2、需求:如何在每次数据库添加操作之后,记录一条行为日志呢?

切入点:post_save # django的modal对象保存后,自动触发(Django的orm在执行create操作,内部也会执行save方法)

 

3、见识了信号之后疑惑信号和中间件的区别?

中间件只是能设置在Django的出口和入口,而中间件散步较广;

 

 

二、应用信号

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

1、导入Django内置信号

    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

 

2、注册信号

为了确保你的程序在启动后就会导入和注册信号,一定要放在Django程序目录的__init__.py文件里

Django之信号和序列化

 

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(sender)                    #操作的那张表
    print(kwargs['instance'].name)  #获取增加的那样记录的 name


pre_save.connect(callback)
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-25
  • 2022-12-23
  • 2021-10-08
  • 2022-01-25
  • 2021-07-12
猜你喜欢
  • 2022-12-23
  • 2021-07-10
  • 2021-07-31
  • 2022-03-06
  • 2022-12-23
  • 2021-07-09
  • 2021-07-16
相关资源
相似解决方案