亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Django自定義信號(hào)(signals)

Hegel_Gu / 1873人閱讀

摘要:中自定義了一些,用于監(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

相關(guān)文章

  • 信號(hào)量-django

    內(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...

    keithxiaoy 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:擴(kuò)展用戶信息

    摘要:博客網(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)碼、頭像等都...

    Eastboat 評(píng)論0 收藏0
  • Django添加全文搜索功能入門篇

    摘要:轉(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)...

    lookSomeone 評(píng)論0 收藏0
  • python blinker庫(kù)學(xué)習(xí)

    摘要:的信號(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)核雖...

    legendmohe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<