摘要:中自定義了一些,用于監(jiān)聽(tīng)一些操作,并發(fā)出通知官方解釋提供一個(gè)信號(hào)分發(fā)器,允許解耦的應(yīng)用在框架的其它地方發(fā)生操作時(shí)會(huì)被通知到。簡(jiǎn)單來(lái)說(shuō),信號(hào)允許特定的通知一組某些操作已經(jīng)發(fā)生?;蛘咴谡?qǐng)求時(shí),記錄請(qǐng)求信息。
django中自定義了一些singals,用于監(jiān)聽(tīng)一些操作,并發(fā)出通知
官方解釋:
Django 提供一個(gè)“信號(hào)分發(fā)器”,允許解耦的應(yīng)用在框架的其它地方發(fā)生操作時(shí)會(huì)被通知到。 簡(jiǎn)單來(lái)說(shuō),信號(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)求到來(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ā)
用法:
利用這幾個(gè)singals可以實(shí)現(xiàn)model中的一些聯(lián)動(dòng)操作,比如,要想更改通過(guò)model更新記錄時(shí),記下操作者的日志,可以直接在操作的地方使用post_save裝飾器,
或者改寫(xiě)post_save,使其記錄相關(guān)信息,一勞永逸?;蛘咴趓equest請(qǐng)求時(shí),記錄請(qǐng)求信息。
from django.core.signals import request_finished from django.dispatch import receiver @receiver(request_finished) def my_callback(sender, **kwargs): print("Request finished!")
如何自定義singals?
a. 定義singal文件
import django.dispatch pizza_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_done pizza_done.send(sender="seven",toppings=123, size=456)
需求場(chǎng)景:
項(xiàng)目中有一個(gè)需求,當(dāng)model(即庫(kù)的數(shù)據(jù))被修改或者刪除時(shí),自動(dòng)觸發(fā)一個(gè)redis的同步任務(wù)(后來(lái)發(fā)現(xiàn)這個(gè)需求沒(méi)有意義....),model的保存有post_save,刪除有post_delete,唯獨(dú)沒(méi)有update,而代碼中使用update的場(chǎng)景蠻多的,就搜了下為什么就是沒(méi)有update的singals。
看到:https://code.djangoproject.co...
其實(shí)很早就有人給django官方提過(guò)這種方式,為什么不在官方版本中添加,具體這個(gè)pr為什么沒(méi)有被接受,可以看下里面的討論,反正當(dāng)時(shí)的django1.9仍然不支持,只能自己先寫(xiě)一個(gè)用用,有問(wèn)題了再撤掉好了。
解決方式:
singals.py文件
# coding:utf-8 from django.dispatch import Signal post_update = Signal(providing_args=["user"])
models.py文件
-----------針對(duì)某個(gè)model,重寫(xiě)其queryset中的update方法-----------
//引入自定義的signal文件 from tools import signals class MyCustomQuerySet(models.query.QuerySet): def update(self, **kwargs): super(MyCustomQuerySet, self).update(**kwargs) //update被調(diào)用時(shí), 發(fā)送該singalsignals signals.post_update.send(sender=self.model, user="xxx") print("finished!") class MyCustomManager(models.Manager): def get_queryset(self): return MyCustomQuerySet(self.model, using=self._db) class crontab_ping(models.Model): name = models.CharField(max_length=64, blank=True, null=True) objects = MyCustomManager()
callback.py文件:
-------接收signal,觸發(fā)操作----------
from tools.signals import post_update @receiver(post_update) def post_update_callback(sender, **kwargs): print(kwargs["user"]) print("post_update_success")
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/44792.html
內(nèi)置的信號(hào)量 model:import django.db.models.signals pre_init = ModelSignal(providing_args=[instance, args, kwargs], use_caching=True) post_init = ModelSignal(providing_args=[instance...
摘要:博客網(wǎng)站的用戶信息并不復(fù)雜,因此擴(kuò)展就足夠了??梢栽谶@個(gè)基礎(chǔ)上,擴(kuò)展為一個(gè)美觀詳細(xì)的用戶信息頁(yè)面。當(dāng)然最好再給個(gè)人信息添加一個(gè)入口。沒(méi)有對(duì)用戶的登錄狀態(tài)進(jìn)行檢查??偨Y(jié)本章使用一對(duì)一鏈接的方式,擴(kuò)展并更新了用戶信息。 可能你已經(jīng)發(fā)現(xiàn)了,Django自帶的User模型非常實(shí)用,以至于我們沒(méi)有寫(xiě)用戶管理相關(guān)的任何模型。 但是自帶的User畢竟可用的字段較少。比方說(shuō)非常重要的電話號(hào)碼、頭像等都...
摘要:轉(zhuǎn)載說(shuō)明來(lái)源添加全文搜索功能入門一使用的工具是的開(kāi)源搜索框架,該框架支持搜索引擎,不用更改代碼,直接切換引擎,減少代碼量。修改如下添加修改為如下第二步在中修改引擎,如下第三步重建索引,在進(jìn)行搜索中文試試吧。 感覺(jué)網(wǎng)絡(luò)上關(guān)于Django全文搜索的中文文章太少,并且講的也不是很到位,就是簡(jiǎn)單介紹了怎么配置,并沒(méi)有說(shuō)這樣配置有什么用,所以依然很迷茫。所以希望我這篇文章能夠幫助到后來(lái)人。 轉(zhuǎn)...
摘要:的信號(hào)機(jī)制就是基于它建立的。觸發(fā)信號(hào)使用方法通知信號(hào)訂閱者。每個(gè)元組的組成為。與是兩個(gè)不同的信號(hào)。這時(shí),可以使用優(yōu)化信號(hào)發(fā)送信號(hào)通常會(huì)進(jìn)行優(yōu)化,以便快速的發(fā)送。 參考 Blinker Documentation Blinker 是一個(gè)基于Python的強(qiáng)大的信號(hào)庫(kù),它既支持簡(jiǎn)單的對(duì)象到對(duì)象通信,也支持針對(duì)多個(gè)對(duì)象進(jìn)行組播。Flask的信號(hào)機(jī)制就是基于它建立的。 Blinker的內(nèi)核雖...
閱讀 2755·2023-04-25 15:22
閱讀 2884·2021-10-11 10:58
閱讀 1111·2021-08-30 09:48
閱讀 1912·2019-08-30 15:56
閱讀 1788·2019-08-30 15:53
閱讀 1168·2019-08-29 11:16
閱讀 1110·2019-08-23 18:34
閱讀 1704·2019-08-23 18:12