色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

正確的理解和使用Django信號(Signals)

瀏覽:15日期:2024-09-10 16:18:34

Django 提供一個了“信號分發器”機制,允許解耦的應用在框架的其它地方發生操作時會被通知到。 通俗而講Django信號的工作原理就是當某個事件發生的時候會發出一個信號(signals), 而監聽這個信號的函數(receivers)就會立即執行。Django信號的應用場景很多,尤其是用于不同模型或程序間的聯動。常見例子包括創建User對象實例時創建一對一關系的UserProfile對象實例,或者每當用戶下訂單時觸發給管理員發郵件的動作。今天小編我就分享下如何正確使用Django的信號(signals)。

Django信號的一個簡單例子

假設我們有一個如下User模型,我們希望每次有User對象新創建時都打印出有新用戶注冊的提示信息,我們可以使用Django信號(signals)輕松實現。我們的信號發送者sender是User模型,每當User模型執行post_save動作時就會發出信號。此時我們自定義的create_user函數一旦監聽到User發出的post_save信號就會執行,先通過if created判斷對象是新創建的還是被更新的;如果對象是新創建的,就會打印出提示信息。

# models.py

from django.db import modelsfrom django.db.models import signalsfrom django.dispatch import receiverclass User(models.Model): name = models.CharField(max_length=16) gender = models.CharField(max_length=32, blank=True)def create_user(sender, instance, created, **kwargs): if created:print('New user created!')post_save.connect(create_user, sender=User)

在上例中我們使用了信號(post_save)自帶的connect的方法將自定義的函數與信號發出者(sender)User模型進行了連接。在實際應用中一個更常用的方式是使用@receiver裝飾器實現發送者與監聽函數的連接,如下所示。@receiver(post_save, sender=User)讀起來的意思就是監聽User模型發出的post_save信號。

from django.db import modelsfrom django.db.models.signals import post_savefrom django.dispatch import receiverclass User(models.Model): name = models.CharField(max_length=16) gender = models.CharField(max_length=32, blank=True)@receiver(post_save, sender=User)def create_user(sender, instance, created, **kwargs): if created:print('New user created!')利用Django信號實現不同模型的聯動更新

我們再來看一個復雜一點的例子。我們有一個Profile模型,與User模型是一對一的關系。我們希望創建User對象實例時也創建Profile對象實例,而使用post_save更新User對象時不創建新的Profile對象。這時我們就可以自定義create_user_profile和save_user_profile兩個監聽函數,同時監聽sender(User模型)發出的post_save信號。由于post_save可同時用于模型的創建和更新,我們用if created這個判斷來加以區別。

from django.db import modelsfrom django.db.models.signals import post_savefrom django.dispatch import receiverclass Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) birth_date = models.DateField(null=True, blank=True)@receiver(post_save, sender=User)def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance)@receiver(post_save, sender=User)def save_user_profile(sender, instance, **kwargs): instance.profile.save()Django常用內置信號

之前的例子中我們使用的都是post_save信號,即在模型調用save()方法后才發送信號。Django其它常用內置信號還包括:

django.db.models.signals.pre_save & post_save在模型調用 save()方法之前或之后發送。 django.db.models.signals.pre_init& post_init在模型調用_init_方法之前或之后發送。 django.db.models.signals.pre_delete & post_delete在模型調用delete()方法或查詢集調用delete() 方法之前或之后發送。 django.db.models.signals.m2m_changed在模型多對多關系改變后發送。 django.core.signals.request_started & request_finished Django建立或關閉HTTP 請求時發送。如何正確放置Django信號的監聽函數代碼

在之前案例中,我們將Django信號的監聽函數寫在了models.py文件里。當一個app的與信號相關的自定義監聽函數很多時,此時models.py代碼將變得非常臃腫。一個更好的方式把所以自定義的信號監聽函數集中放在app對應文件夾下的signals.py文件里,便于后期集中維護。

假如我們有個account的app,包含了User和Pofile模型,我們不僅需要在account文件夾下新建signals.py,還需要修改account文件下apps.py和__init__.py,以導入創建的信號監聽函數。

# account/signals.py

from django.db.models.signals import post_savefrom django.dispatch import receiverfrom .models import User, Profile@receiver(post_save, sender=User)def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance)@receiver(post_save, sender=User)def save_user_profile(sender, instance, **kwargs): instance.profile.save()

# account/apps.py

from django.apps import AppConfigclass AccountConfig(AppConfig): name = ’account’ def ready(self):import account.signals

# account/__init__.py

default_app_config = ’account.apps.AccountConfig’小結

在本文里我們總結了Django信號(signals)的工作原理,介紹了如何使用Django信號實現模型或程序的聯動。最后我們還總結了Django常用內置信號以及如何正確放置自定義的信號監聽函數。歡迎關注我們更多Python Web開發和Django原創文章。

以上就是正確的理解和使用Django信號(Signals)的詳細內容,更多關于Django信號(Signals)的資料請關注好吧啦網其它相關文章!

標簽: Django
相關文章:
主站蜘蛛池模板: 乱子伦农村xxxx | 精品国产免费久久久久久 | 国产高清亚洲 | 日韩精品a在线视频 | 亚洲欧洲日本天天堂在线观看 | 欧美在线观看一区二区三区 | 一级国产a级a毛片无卡 | 99久久香蕉 | 中文字幕亚洲一区 | 精品久久久久久久高清 | 精品久久成人免费第三区 | 国内精品久久国产大陆 | 亚洲一区二区三区免费视频 | 久久草在线视频 | 国产精品久久人人做人人爽 | 亚洲一级理论片 | 久久久亚洲精品蜜桃臀 | 国产禁女女网站免费看 | 91久久青青草原线免费 | 欧美性猛交xxxxx按摩国内 | 国产玖玖在线观看 | 精品国产高清久久久久久小说 | 欧美高清色视频在线播放 | 成年人在线免费观看视频网站 | 99re热视频这里只精品 | 三级精品 | a级淫片| 一级毛片不收费 | 荡公乱妇蒂芙尼中文字幕 | 女高中生被cao到哭视频 | 日韩欧美一区二区中文字幕 | 国产一区二区三区日韩 | 欧美色视频在线观看 | 黄色网址视频在线观看 | 亚洲黄色免费网址 | 成在线人永久免费播放视频 | 色香欲综合成人免费视频 | 一区二区三区欧美日韩国产 | 免费精品国产日韩热久久 | 欧美一线高本道高清在线 | 国产成版人视频网站免费下 |