信号 应用场景 内置信号 内置信号操作 自定义信号

信号

在某些操作前后,允许特定操作

应用场景

在数据库操作前后,添加日志。

内置信号

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

自定义信号

自定制操作

  1. 定义信号

     sg.py
     	import django.dispatch
     
     	pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
    
  2. 注册信号

     sg.py
     	def callback(sender, **kwargs):
     	    print("callback")
     	    print(sender, kwargs)
     	
     	pizza_done.connect(callback)
    
  3. 触发信号

     views.py
     	def signal(request):
     		from sg import pizza_done
         	pizza_done.send(sender="asdfasdf", toppings=123, size=456) # 参数值任意
     		return HttpResponse('ok')
    

注:特定条件下,触发自定义信号,比较有意义。例如,添加发送微信

原文地址:https://www.cnblogs.com/todayisafineday/p/8783723.html