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

 

示例:

=== models.py === 

from django.db import models
class UserInfo(models.Model):
    user = models.CharField(max_length=32)

=== views.py===

from app import models
def signal(reuqest):
    obj = models.UserInfo(user='root')
    print(1)
    obj.save()

    obj = models.UserInfo(user='root')
    print(2)
    obj.save()

    obj = models.UserInfo(user='root')     
    print(3)
    obj.save()
  return HttpResponse('ok')
 

=== sig.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 f1(sender, **kwargs):
        print("f1")
def f2(sender, **kwargs):
        print("f2")

pre_init.connect(f1) # 在信号中注册f1函数
pre_save.connect(f2) # 在信号中注册f2函数

=== __init__.py ===

import pymysql
pymysql.install_as_MySQLdb()
import sig

 

自定义信号

=== sig.py === 

import django.dispatch
personal_sig = django.dispatch.Signal(providing_args=["a1", "a2"])

def f3(sender, **kwargs):
    print("f3")
    print(sender,kwargs)

personal_sig.connect(f3)

=== views.py ===

from sig import personal
def signal(reuqest):
    persnal_sig.send(sender="xxx",a1='xxx', a2='xxx') #触发信号, sender表示触发者,a1和a2表示根据自定义信号必须传递的两个参数
    return HttpResponse('ok')

 

自定义信号应用:某个监控参数达到上限时触发动作(发送邮件或调用微信接口发送微信消息)

 

posted @ 2018-01-27 15:37  bobo0609  Views(110)  Comments(0)    收藏  举报