国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Django自定義信號(hào)(signals)

2020-02-15 23:14:00
字體:
供稿:網(wǎng)友

django中自定義了一些singals,用于監(jiān)聽一些操作,并發(fā)出通知

官方解釋:

Django 提供一個(gè)“信號(hào)分發(fā)器”,允許解耦的應(yīng)用在框架的其它地方發(fā)生操作時(shí)會(huì)被通知到。

簡(jiǎn)單來說,信號(hào)允許特定的sender通知一組receiver某些操作已經(jīng)發(fā)生。這在多處代碼和同一事件有關(guān)聯(lián)的情況下很有用。
django中已經(jīng)內(nèi)置了一些singals,在django/db/models/signal.py中,如

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類,對(duì)于每一個(gè)類,自動(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)求到來前,自動(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ù)庫連接時(shí),自動(dòng)觸發(fā)

用法:

利用這幾個(gè)singals可以實(shí)現(xiàn)model中的一些聯(lián)動(dòng)操作,比如,要想更改通過model更新記錄時(shí),記下操作者的日志,可以直接在操作的地方使用post_save裝飾器,

或者改寫post_save,使其記錄相關(guān)信息,一勞永逸。或者在request請(qǐng)求時(shí),記錄請(qǐng)求信息。

from django.core.signals import request_finishedfrom django.dispatch import receiver@receiver(request_finished)def my_callback(sender, **kwargs):  print("Request finished!")

如何自定義singals?

a. 定義singal文件

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

b. 注冊(cè)singal

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

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

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

需求場(chǎng)景:

項(xiàng)目中有一個(gè)需求,當(dāng)model(即庫的數(shù)據(jù))被修改或者刪除時(shí),自動(dòng)觸發(fā)一個(gè)redis的同步任務(wù)(后來發(fā)現(xiàn)這個(gè)需求沒有意義....),model的保存有post_save,刪除有post_delete,唯獨(dú)沒有update,而代碼中使用update的場(chǎng)景蠻多的,就搜了下為什么就是沒有update的singals。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴青县| 新津县| 大田县| 皋兰县| 盱眙县| 梨树县| 东丽区| 平武县| 怀远县| 甘谷县| 宣威市| 玉田县| 安图县| 邛崃市| 柳林县| 崇义县| 色达县| 资阳市| 会泽县| 永和县| 昂仁县| 托克逊县| 手游| 鹤峰县| 彭水| 利津县| 进贤县| 曲靖市| 玉门市| 澳门| 沅江市| 芒康县| 林西县| 湄潭县| 西吉县| 平昌县| 云龙县| 湟中县| 加查县| 香港 | 五原县|