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

首頁 > 編程 > Python > 正文

Django的信號機制詳解

2019-11-25 16:12:10
字體:
來源:轉載
供稿:網友

Django提供一種信號機制。其實就是觀察者模式,又叫發布-訂閱(Publish/Subscribe) 。當發生一些動作的時候,發出信號,然后監聽了這個信號的函數就會執行。

Django內置了一些信號,比如:

django.db.models.signals.pre_save 在某個Model保存之前調用django.db.models.signals.post_save 在某個Model保存之后調用django.db.models.signals.pre_delete 在某個Model刪除之前調用django.db.models.signals.post_delete 在某個Model刪除之后調用django.core.signals.request_started 在建立Http請求時發送django.core.signals.request_finished 在關閉Http請求時發送

我們要做的,就是注冊一個receiver函數。例如,如果要在每次請求完成之后,打印一行字。

可以使用回調的方式注冊:

# receiverdef my_callback(sender, **kwargs):  print("Request finished!") # connectfrom django.core.signalsimport request_finished request_finished.connect(my_callback)

也可以使用裝飾器的方式注冊,下面這段代碼和上面完全是等價的。

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

receiver回調函數除了可以使用sender之外,還可以使用其他一些參數,比如針對pre_save函數:

sender:發送者(如果是pre_save的話,就是model class)
instance:實例
raw
using
update_fields
post_save()是一個比較實用函數,可以支持一些聯動的更新。而不必讓我們每次都寫在view里面。比如:有用戶提交了退款申請,我們需要把訂單的狀態修改成“已退款”的狀態。就可以使用信號機制,而不必在每處都修改。

@receiver(post_save, sender=RefundForm)deforder_state_update(sender, instance, created, **kwargs):  instance.order.state = REFUNDING  instance.order.save() # 這里,order是refundform的一個外鍵

當然,這里可以寫的更多更周全,例如退款單取消改回狀態等。

觀察者是非常實用的一個設計模式,Django也支持用戶 自定義 一些信號。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玉溪市| 托克逊县| 大方县| 兰溪市| 南靖县| 庆元县| 萨迦县| 隆安县| 日土县| 吴堡县| 城市| 古交市| 勃利县| 大悟县| 枣庄市| 南通市| 临澧县| 巴彦淖尔市| 璧山县| 安达市| 铜鼓县| 阳春市| 贵阳市| 商洛市| 河西区| 阳城县| 呼伦贝尔市| 麟游县| 迭部县| 汉阴县| 大悟县| 营口市| 张北县| 宣武区| 呼图壁县| 金沙县| 南雄市| 石景山区| 兴业县| 雷山县| 确山县|