django 內置“信號”機制和自定義方法



一、引子

  在操作數據的時候,假設我們需要記錄一些日志,這個時候,我們需要用什么來顯示這個需求呢?裝飾器?裝飾器只能先實現整體的操作。在django 里面有這么一個東西--信號 下面我們就來了解了解它。

  操作對象前后,django都會預留兩個鈎子,它是用signals.post_save.send,表示觸發一個信號。所以比如說我們在操作數據庫的時候,要在插入數據之前寫入日志,插入完成之后也寫入日志,那這個就會用到我們今天的django信號。Django中提供了“信號調度”,用於在框架執行操作時解耦。通俗來講,就是一些動作發生的時候,信號允許特定的發送者去提醒一些接受者。

二、django的內置信號

  

復制代碼
 1 Model signals
 2     pre_init                    # django的modal執行其構造方法前,自動觸發
 3     post_init                   # django的modal執行其構造方法后,自動觸發
 4     pre_save                    # django的modal對象保存前,自動觸發
 5     post_save                   # django的modal對象保存后,自動觸發
 6     pre_delete                  # django的modal對象刪除前,自動觸發
 7     post_delete                 # django的modal對象刪除后,自動觸發
 8     m2m_changed                 # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動觸發
 9     class_prepared              # 程序啟動時,檢測已注冊的app中modal類,對於每一個類,自動觸發
10 Management signals
11     pre_migrate                 # 執行migrate命令前,自動觸發
12     post_migrate                # 執行migrate命令后,自動觸發
13 Request/response signals
14     request_started             # 請求到來前,自動觸發
15     request_finished            # 請求結束后,自動觸發
16     got_request_exception       # 請求異常后,自動觸發
17 Test signals
18     setting_changed             # 使用test測試修改配置文件時,自動觸發
19     template_rendered           # 使用test測試渲染模板時,自動觸發
20 Database Wrappers
21     connection_created          # 創建數據庫連接時,自動觸發
復制代碼

  對於Django內置的信號,僅需注冊指定信號,當程序執行相應操作時,自動觸發注冊函數:

復制代碼
 1 import win_unicode_console
 2 win_unicode_console.enable()#這個在windows里面用的,這個需要用之前先安裝一下
 3 from django.core.signals import request_finished
 4 from django.core.signals import request_started
 5 from django.core.signals import got_request_exception
 6  
 7 from django.db.models.signals import class_prepared
 8 from django.db.models.signals import pre_init, post_init
 9 from django.db.models.signals import pre_save, post_save
10 from django.db.models.signals import pre_delete, post_delete
11 from django.db.models.signals import m2m_changed
12 from django.db.models.signals import pre_migrate, post_migrate
13  
14 from django.test.signals import setting_changed
15 from django.test.signals import template_rendered
16  
17 from django.db.backends.signals import connection_created
18  
19 #這個函數你想寫什么寫什么,這邊的注冊函數可以寫多個
20 def callback(sender, **kwargs):
21       print("xxoo_callback")
22       print(sender,kwargs)
23  
24 xxoo.connect(callback)  #注冊函數
25 # xxoo指上述導入的內容,比如pre_init.connect(callback)
復制代碼

  注意了:當程序執行操作時,會自動觸發注冊函數,但是,不是隨便放的,需要放在 project下的__init__.py文件中,這樣的話,項目啟動,文件內容就會自動加載到內存中,這樣我們就可以方便使用了:

  

三、搞一搞,測試一把

  3.1 models 創建數據庫

?
1
2
class User(models.Model):
     user=models.CharField(max_length=32)< br >< br >執行:< code class="python plain hljs">python  manage.py makemigrations</ code >
   python  manage.py migrate

  3.2,views 

復制代碼
 1 from app01 import models
 2 def signal(request):
 3     obj=models.User(user="root")
 4 
 5     print("end")
 6     obj.save()
 7 
 8     obj1=models.User(user="root1")
 9     obj1.save()
10     return HttpResponse("TEST SIGNAL")
復制代碼

  urls

path("signal/",views.signal),

訪問

  輸入:

 所以我們看出來了,我們調用了數據庫操作的信號,所以在所有的modles操作之前都有這個操作,這個只是插入數據庫之前的操作,如果想要看更多操作,請看上面的操作。

3.3、django信號創建流程

 
          

四、自定義信號

  4.1、創建信號

    說明:pizza_done是信號名,providing_args=["toppings", "size"],這個是觸發者的時候需要傳遞的參數    

1 import django.dispath
2 
3 pizza_done=django.dispath.Signal(providing_args=["toppings","size"])

  4.2、注冊信號    

1 def callback(sender, **kwargs):  #創建注冊信號的函數,這邊的注冊函數可以寫多個
2     print("callback")
3     print(sender,kwargs)
4   
5 pizza_done.connect(callback)  #注冊信號

  4.3、觸發信號  

?
1
2
3
from 路徑 import pizza_done
   
pizza_done.send(sender='zhangqigao',toppings=123, size=456)

  下面搞栗子

  

  

所以我們自定義信號的時候,我們自己觸發就行了。那我們在什么情況下使用呢 ?

答:你某個閥值,你去監控服務器,當到達某個狀態的時候,就可以讓他執行某個操作,等着你的要求,源碼不要動,只需要注冊信號就可以了。

由於內置信號的觸發者已經集成到Django中,所以其會自動調用,而對於自定義信號則需要開發者在任意位置觸發。

更多:猛擊這里



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM