Django 框架之 Django信號

知識點

  1. 概念
  2. 如何監(jiān)聽信號
  3. Django內(nèi)置信號
  4. 自定義信號
  5. 使用Django內(nèi)置信號

概念

Django 提供一個“信號分發(fā)器”心软,允許解耦的應用在框架的其它地方發(fā)生操作時會被通知到。
也就是說在特定事件發(fā)生時著蛙,可以發(fā)送一個信號去通知注冊了這個信號的一個或者多個回調(diào)删铃,在回調(diào)里進行邏輯處理。

如何監(jiān)聽信號

擁有一個Signal實例
信號回調(diào)
將信號回調(diào)綁定到Signal實例
在特定事件中Signal發(fā)送信號

Django內(nèi)置信號

django.db.models.signals.pre_save & post_save?在模型 save()方法調(diào)用之前或之后發(fā)送踏堡。
django.db.models.signals.pre_delete & post_delete?在模型delete()方法或查詢集的delete() 方法調(diào)用之前或之后發(fā)送猎唁。
django.core.signals.request_started & request_finished?Django建立或關(guān)閉HTTP 請求時發(fā)送。

參考文檔

代碼地址:Spareibs的Github

實驗操作

自定義信號

注冊信號

【signal.py】

from django.dispatch import Signal, receiver

signalAllen = Signal(providing_args=['allen'])

@receiver(signalAllen)
def signal_callback(sender, **kwargs):
    print(sender, kwargs)
    print('signal_callback called')

# 注冊顷蟆,或者使用裝飾器注冊
# signalAllen.connect(signal_callback)

# 可以定義多個
@receiver(signalAllen)
def signal_callback1(sender, **kwargs):
    print(sender, kwargs)
    print('signal_callback1 called')

【urls.py】

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', view=views.index),
]

【views.py】

from . import signals
# Create your views here.

def index(request):
    signals.signalAllen.send(sender=None, allen='test')
    return render(request, template_name='index.html')

刪除信號

【urls.py】

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^disconnect/$', view=views.disconnect_signal),
]

【views.py】

def disconnect_signal(request):
    signals.signalAllen.disconnect(signals.signal_callback)
    return render(request, template_name='index.html')

Django 內(nèi)置信號

簡單使用

【views.py】

from django.shortcuts import render
from .models import Poem, Task
# Create your views here.

def modify(request):
    poem = Poem.objects.get(pk=1)
    poem.title = '1'
    # 會發(fā)送兩個信號pre_save和post_save
    poem.save()

    task = Task.objects.get(pk=1)
    task.name = '1'
    task.save()

    return render(request, template_name='index.html')

【urls.py】

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^modify/$', view=views.modify),
]

【singals.py】

from django.db.models.signals import pre_save, post_save

@receiver(pre_save)
def pre_save_callback(sender, **kwargs):
    print('pre_save_callback')


@receiver(post_save)
def post_save_callback(sender, **kwargs):
    print('post_save_callback')

指定信號

【views.py】

from django.shortcuts import render
from .models import Poem, Task
# Create your views here.

def modify(request):
    poem = Poem.objects.get(pk=1)
    poem.title = '1'
    # 會發(fā)送兩個信號pre_save和post_save
    poem.save()

    task = Task.objects.get(pk=1)
    task.name = '1'
    task.save()

    return render(request, template_name='index.html')

【urls.py】

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^modify/$', view=views.modify),
]

【singals.py】

from django.db.models.signals import pre_save, post_save
from .models import Poem, Task

@receiver(pre_save, sender=Poem)
def pre_save_callback(sender, **kwargs):
    print('pre_save_callback', sender, kwargs)


@receiver(post_save, sender=Task)
def post_save_callback(sender, **kwargs):
    print('post_save_callback', sender, kwargs)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诫隅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帐偎,更是在濱河造成了極大的恐慌逐纬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削樊,死亡現(xiàn)場離奇詭異豁生,居然都是意外死亡,警方通過查閱死者的電腦和手機漫贞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門沛硅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绕辖,你說我怎么就攤上這事摇肌。” “怎么了仪际?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵围小,是天一觀的道長昵骤。 經(jīng)常有香客問我,道長肯适,這世上最難降的妖魔是什么变秦? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮框舔,結(jié)果婚禮上蹦玫,老公的妹妹穿的比我還像新娘。我一直安慰自己刘绣,他們只是感情好樱溉,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布称龙。 她就那樣靜靜地躺著澎嚣,像睡著了一般肤粱。 火紅的嫁衣襯著肌膚如雪牢贸。 梳的紋絲不亂的頭發(fā)上谈火,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天审胸,我揣著相機與錄音梭纹,去河邊找鬼捺僻。 笑死恋技,一個胖子當著我的面吹牛拇舀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜻底,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼你稚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朱躺?” 一聲冷哼從身側(cè)響起刁赖,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎长搀,沒想到半個月后宇弛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡源请,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年枪芒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谁尸。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舅踪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出良蛮,到底是詐尸還是另有隱情抽碌,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布决瞳,位于F島的核電站货徙,受9級特大地震影響左权,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痴颊,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一赏迟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蠢棱,春花似錦锌杀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饰豺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間允蜈,已是汗流浹背冤吨。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饶套,地道東北人漩蟆。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像妓蛮,于是被迫代替她去往敵國和親怠李。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容