zoukankan      html  css  js  c++  java
  • 信号 应用场景 内置信号 内置信号操作 自定义信号

    信号

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

    应用场景

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

    内置信号

    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')
      

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

  • 相关阅读:
    庆祝 杀马下载量突破300万!
    智能实验室-杀马(Defendio) 4.26.0.940
    智能实验室-全能优化(Guardio) 4.992.0.900
    智能实验室-杀马(Defendio) 4.17.0.850
    目前为止功能最全的基于silverlight4(beta)的摄像头应用
    Discuz!NT负载均衡方案
    Discuz!NT跨站缓存同步
    Discuz!NT负载均衡解决方案(HA)之LVS(Linux Virtual Server)
    Discuz!NT企业版之Sphinx全文搜索(下)
    Discuz!NT千万级数据量上的两驾马车TokyoCabinet,MongoDB
  • 原文地址:https://www.cnblogs.com/todayisafineday/p/8783723.html
Copyright © 2011-2022 走看看