日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:49日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久久国产精品美女| sm捆绑调教国产免费网站在线观看| 精品一级视频| 久久精品福利| 激情婷婷欧美| 在线精品观看| 国产毛片精品| 亚洲va中文在线播放免费| 亚洲精品电影| 日韩精品亚洲专区| 欧美交a欧美精品喷水| 欧美三级网址| 亚洲精品日韩久久| 国产videos久久| 尤物在线精品| 国产欧美二区| 国户精品久久久久久久久久久不卡| 黄色亚洲精品| 久久精品xxxxx| 麻豆精品蜜桃| 视频一区日韩精品| 成人福利视频| 日本亚洲视频| 天堂√中文最新版在线| 亚洲精品福利| 日韩久久视频| 亚洲另类黄色| 色偷偷偷在线视频播放| 日日夜夜免费精品视频| 日韩成人三级| 国产日韩欧美三区| 女同性一区二区三区人了人一| 91精品美女| 午夜av一区| 狠狠久久伊人| 日韩1区2区3区| 久久国产成人午夜av影院宅| 国产一级成人av| 欧美精品自拍| 岛国av在线播放| 青青草国产成人99久久| 婷婷国产精品| 老牛国内精品亚洲成av人片| 蜜桃传媒麻豆第一区在线观看| 精品99久久| 日本不卡视频在线观看| 国产在线日韩| 久久这里只有| 中文字幕成人| 日韩在线观看一区| 奇米亚洲欧美| 欧美在线资源| 日韩成人精品一区二区| 日韩精品免费观看视频| 国产高清一区| 日韩欧美网址| 国产欧美日韩一区二区三区四区| 午夜欧美视频| 日韩在线中文| 国产一区二区三区四区大秀| 欧美一区激情| 免费观看在线综合色| 国产精品毛片久久| 欧美久久一区二区三区| 亚洲一区二区av| 妖精视频成人观看www| 亚洲va中文在线播放免费| 久久久久伊人| 国产精品伊人| 欧美日一区二区三区在线观看国产免 | 极品av在线| 国产精品调教| 免费成人在线影院| 国产精品啊啊啊| 欧美欧美黄在线二区| 亚洲网址在线观看| 91成人网在线观看| 久久高清免费| 91精品一区二区三区综合| 黑森林国产精品av| 国产理论在线| 精品国产精品国产偷麻豆| 91欧美极品| 欧美亚洲人成在线| 国产日韩欧美一区二区三区| 日韩 欧美一区二区三区| 在线国产日韩| 亚洲bt欧美bt精品777| 国产亚洲永久域名| 在线午夜精品| 亚洲网址在线观看| 日韩一区二区三区在线看| 亚洲bt欧美bt精品777| 日本午夜免费一区二区| 欧美在线首页| 国产精品17p| 福利一区和二区| 精品欧美一区二区三区在线观看| se01亚洲视频| 自拍自偷一区二区三区| 亚洲欧美日韩国产| 亚洲资源在线| 91亚洲精品在看在线观看高清| 亚洲精品一二| 日韩黄色在线观看| 国产精品一页| 国产一区二区三区探花| 91精品xxx在线观看| 午夜电影亚洲| 亚洲精品中文字幕99999| 久久激情五月婷婷| 日韩av二区| 狠狠色狠狠色综合日日tαg| 亚洲精品高潮| 国产精品亲子伦av一区二区三区| 国产精品红桃| 蜜臀久久精品| 综合国产精品| 国产精品v日韩精品v欧美精品网站 | 欧美日韩国产探花| 石原莉奈在线亚洲二区| 91p九色成人| 黄色在线观看www| 一区二区三区午夜视频| 日韩电影二区| 99久久亚洲精品蜜臀| 久久不射网站| 欧美激情网址| 中文字幕高清在线播放| 一区二区视频欧美| 国产乱码精品一区二区亚洲| 美女福利一区二区三区| 视频精品一区二区| 欧美激情aⅴ一区二区三区| 日本精品影院| 日韩极品在线观看| 日韩免费av| 日韩一区欧美二区| 精品高清久久| 免费看黄色91| sm捆绑调教国产免费网站在线观看 | 日韩中文字幕一区二区三区| 欧美日韩夜夜| 亚洲午夜av| 国产免费播放一区二区| 久久中文字幕av| 欧美精品观看| 欧美成人亚洲| 欧美成a人片免费观看久久五月天| 日韩一区二区久久| 蜜桃视频一区二区三区在线观看| 国产毛片久久久| a天堂资源在线| 亚洲网址在线观看| 日本欧美不卡| 欧美成a人片免费观看久久五月天| 91久久中文| 色婷婷色综合| 欧美一区免费| 99pao成人国产永久免费视频 | 日本 国产 欧美色综合| 日韩大片免费观看| 国产精品视频一区视频二区| 亚洲欧美日韩在线观看a三区| 高清av一区| 国产丝袜一区| 欧美中文日韩| 亚洲黑丝一区二区| 都市激情国产精品| 国产欧美日韩一区二区三区四区| 99国产成+人+综合+亚洲欧美| 日本午夜免费一区二区| 亚洲自拍另类| 欧美69视频| 成人在线视频中文字幕| 日韩福利视频网| 亚洲天堂免费| 亚洲黄色在线| 日韩综合精品| 精品三级久久久| 国产情侣一区在线| 中文字幕亚洲精品乱码| 亚洲va中文在线播放免费| 麻豆久久一区| 国产精品一区二区精品| 日韩精品91亚洲二区在线观看| 免费日韩av| 国产亚洲精品自拍| 日韩午夜黄色| 亚洲国产一区二区在线观看| 亚洲免费福利| 黑人精品一区| sm捆绑调教国产免费网站在线观看| 国产另类在线| 国产乱码精品一区二区三区亚洲人| 日韩精品第一| 亚洲精品高潮| 日本电影久久久| 日韩1区2区日韩1区2区| 日韩国产一二三区|