day21-Django信号

一、前言

  今天我们学习一下django的信号,这个是干嘛用的呐?其实在django内部已经帮你封装了一些钩子,在操作对象前后,django都会预留两个钩子,它是用signals.post_save.send,表示触发一个信号。所以比如说我们在操作数据库的时候,要在插入数据之前写入日志,插入完成之后也写入日志,那这个就会用到我们今天的django信号。Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

二、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          # 创建数据库连接时,自动触发

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

import win_unicode_console
win_unicode_console.enable()#这个在windows里面用的,这个需要用之前先安装一下
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指上述导入的内容,比如pre_init.connect(callback)

注意了:当程序执行操作时,会自动触发注册函数,但是,不是随便放的,需要放在 project下的__init__.py文件中,这样的话,项目启动,文件内容就会自动加载到内存中,这样我们就可以方便使用了:

三、应用

3.1、创建数据库User

说明:我们就用一个简单的module,格式如下:

from django.db import models

class User(models.Model):

    username = models.CharField(max_length=10)

 当然你需要执行如下:

python  manage.py makemigrations
python  manage.py migrate

3.2、view视图设置

说明:我们导入数据库,然后再数据库创建数据之前设置一个django钩子

def single(request):
    from app01 import models

    obj = models.User(username='root')
    print("end")
    obj.save()

    return  HttpResponse("ok")

这边url我们就设置成  http://127.0.0.1:8000/single/  就可以了,访问输出:

xxoo_callback
<class 'app01.models.User'> {'signal': <django.db.models.signals.ModelSignal object at 0x000001EBA987E940>, 'kwargs': {'username': 'root'}, 'args': ()}
end

 所以我们看出来了,我们调用了数据库操作的信号,所以在所有的modles操作之前都有这个操作,这个只是插入数据库之前的操作,如果想要看更多操作,请看上面的操作。

3.3、django信号创建流程

四、自定义信号

4.1、原理图

说明:根据内置信号的原理,我们自定义信号的原理也差不多,所以原理图如下:

4.2、定义信号

说明:pizza_done是信号名,providing_args=["toppings", "size"],这个是触发者的时候需要传递的参数

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

4.3、注册信号

def callback(sender, **kwargs):  #创建注册信号的函数,这边的注册函数可以写多个
    print("callback")
    print(sender,kwargs)
 
pizza_done.connect(callback)  #注册信号

4.4、 触发信号

from 路径 import pizza_done
 
pizza_done.send(sender='zhangqigao',toppings=123, size=456)

使用:

 

 所以我们自定义信号的时候,我们自己触发就行了。那我们在什么情况下使用呢

答:你某个阀值,你去监控服务器,当到达某个状态的时候,就可以让他执行某个操作,等着你的要求,源码不要动,只需要注册信号就可以了。

由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。

更多:猛击这里

posted @ 2018-04-19 15:53  帅丶高高  阅读(208)  评论(0编辑  收藏  举报