溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

django 信號(hào)調(diào)度機(jī)制詳解

發(fā)布時(shí)間:2020-09-16 18:01:57 來(lái)源:腳本之家 閱讀:121 作者:Crazymagic 欄目:開(kāi)發(fā)技術(shù)

前言

Django中提供了“信號(hào)調(diào)度”,用于在框架執(zhí)行操作時(shí)解耦。通俗來(lái)講,就是一些動(dòng)作發(fā)生的時(shí)候,信號(hào)允許特定的發(fā)送者去提醒一些接受者。

1、Django內(nèi)置信號(hào)

Model signals
  pre_init          # django的modal執(zhí)行其構(gòu)造方法前,自動(dòng)觸發(fā)
  post_init          # django的modal執(zhí)行其構(gòu)造方法后,自動(dòng)觸發(fā)
  pre_save          # django的modal對(duì)象保存前,自動(dòng)觸發(fā)
  post_save          # django的modal對(duì)象保存后,自動(dòng)觸發(fā)
  pre_delete         # django的modal對(duì)象刪除前,自動(dòng)觸發(fā)
  post_delete         # django的modal對(duì)象刪除后,自動(dòng)觸發(fā)
  m2m_changed         # django的modal中使用m2m字段操作第三張表(add,remove,clear)前后,自動(dòng)觸發(fā)
  class_prepared       # 程序啟動(dòng)時(shí),檢測(cè)已注冊(cè)的app中modal類(lèi),對(duì)于每一個(gè)類(lèi),自動(dòng)觸發(fā)
Management signals
  pre_migrate         # 執(zhí)行migrate命令前,自動(dòng)觸發(fā)
  post_migrate        # 執(zhí)行migrate命令后,自動(dòng)觸發(fā)
Request/response signals
  request_started       # 請(qǐng)求到來(lái)前,自動(dòng)觸發(fā)
  request_finished      # 請(qǐng)求結(jié)束后,自動(dòng)觸發(fā)
  got_request_exception    # 請(qǐng)求異常后,自動(dòng)觸發(fā)
Test signals
  setting_changed       # 使用test測(cè)試修改配置文件時(shí),自動(dòng)觸發(fā)
  template_rendered      # 使用test測(cè)試渲染模板時(shí),自動(dòng)觸發(fā)
Database Wrappers
  connection_created     # 創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),自動(dòng)觸發(fā)

對(duì)于Django內(nèi)置的信號(hào),僅需注冊(cè)指定信號(hào),當(dāng)程序執(zhí)行相應(yīng)操作時(shí),自動(dòng)觸發(fā)注冊(cè)函數(shù):

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 callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender,kwargs)

  xxoo.connect(callback)
  # xxoo指上述導(dǎo)入的內(nèi)容
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")

2、自定義信號(hào)

a. 定義信號(hào)

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

b. 注冊(cè)信號(hào)  

def callback(sender, **kwargs):
  print("callback")
  print(sender,kwargs)
 
pizza_done.connect(callback)


c. 觸發(fā)信號(hào)

from 路徑 import pizza_done
 
pizza_done.send(sender='seven',toppings=123, size=456)

由于內(nèi)置信號(hào)的觸發(fā)者已經(jīng)集成到Django中,所以其會(huì)自動(dòng)調(diào)用,而對(duì)于自定義信號(hào)則需要開(kāi)發(fā)者在任意位置觸發(fā)。  

需求:

在表中每增加一條數(shù)據(jù)的時(shí)候,記錄一條日志

django 信號(hào)調(diào)度機(jī)制詳解

django_signals/__init__.py

from django.db.models import signals

def before_save1(*args,**kwargs):
  print('有車(chē)來(lái)了,我要服務(wù)了--》',args,kwargs)

def before_save2(*args,**kwargs):
  print('有車(chē)來(lái)了,我要服務(wù)了--》',args,kwargs)

def after_save1(*args,**kwargs):
  print('有車(chē)來(lái)了,完事了--》',args,kwargs)

# 增加之前
signals.pre_save.connect(before_save1)
signals.pre_save.connect(before_save2)
# 增加之后
signals.post_save.connect(after_save1)

django_signals/__init__.py

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI