信号
在某些操作前后,允许特定操作
应用场景
在数据库操作前后,添加日志。
内置信号
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内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数
内置信号操作
在工程下写一个python文件,文件名任意,例如sg.py
sg.py
from django.db.models.signals import pre_init, post_init
import inspect
def before_create(sender, **kwargs):
print("%s" % inspect.stack()[0][3])
# print(sender, kwargs)
def after_create(sender, **kwargs):
print("%s" % inspect.stack()[0][3])
# print(sender, kwargs)
pre_init.connect(before_create)
post_init.connect(after_create)
在工程的__init__.py
import sg # 工程启动时,自动加载
app的models.py
from django.db import models
class UserInfo(models.Model):
username = models.CharField(max_length=32)
urls.py
url(r'^signal/', views.signal),
app的views.py
from app01 import models
def signal(request):
obj = models.UserInfo(username='Emma')
print('start')
obj.save()
models.UserInfo.objects.create(username='Wilson')
print('end')
return HttpResponse('ok')
执行结果:
before_create
after_create
start
before_create
after_create
end
[11/Jan/2018 21:00:16] "GET /signal/ HTTP/1.1" 200 2
自定义信号
自定制操作
-
定义信号
sg.py import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
-
注册信号
sg.py def callback(sender, **kwargs): print("callback") print(sender, kwargs) pizza_done.connect(callback)
-
触发信号
views.py def signal(request): from sg import pizza_done pizza_done.send(sender="asdfasdf", toppings=123, size=456) # 参数值任意 return HttpResponse('ok')
注:特定条件下,触发自定义信号,比较有意义。例如,添加发送微信