最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年04月14日 15:43:53   作者:大江狗  
這篇文章主要介紹了如何正確的理解和使用Django信號(hào)(Signals),幫助大家更好的理解和學(xué)習(xí)是Django,感興趣的朋友可以了解下

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

Django信號(hào)的一個(gè)簡(jiǎn)單例子

假設(shè)我們有一個(gè)如下User模型,我們希望每次有User對(duì)象新創(chuàng)建時(shí)都打印出有新用戶注冊(cè)的提示信息,我們可以使用Django信號(hào)(signals)輕松實(shí)現(xiàn)。我們的信號(hào)發(fā)送者sender是User模型,每當(dāng)User模型執(zhí)行post_save動(dòng)作時(shí)就會(huì)發(fā)出信號(hào)。此時(shí)我們自定義的create_user函數(shù)一旦監(jiān)聽到User發(fā)出的post_save信號(hào)就會(huì)執(zhí)行,先通過(guò)if created判斷對(duì)象是新創(chuàng)建的還是被更新的;如果對(duì)象是新創(chuàng)建的,就會(huì)打印出提示信息。

# models.py

from django.db import models

from django.db.models import signals
from django.dispatch import receiver

class 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)

在上例中我們使用了信號(hào)(post_save)自帶的connect的方法將自定義的函數(shù)與信號(hào)發(fā)出者(sender)User模型進(jìn)行了連接。在實(shí)際應(yīng)用中一個(gè)更常用的方式是使用@receiver裝飾器實(shí)現(xiàn)發(fā)送者與監(jiān)聽函數(shù)的連接,如下所示。@receiver(post_save, sender=User)讀起來(lái)的意思就是監(jiān)聽User模型發(fā)出的post_save信號(hào)。

from django.db import models

from django.db.models.signals import post_save
from django.dispatch import receiver

class 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信號(hào)實(shí)現(xiàn)不同模型的聯(lián)動(dòng)更新

我們?cè)賮?lái)看一個(gè)復(fù)雜一點(diǎn)的例子。我們有一個(gè)Profile模型,與User模型是一對(duì)一的關(guān)系。我們希望創(chuàng)建User對(duì)象實(shí)例時(shí)也創(chuàng)建Profile對(duì)象實(shí)例,而使用post_save更新User對(duì)象時(shí)不創(chuàng)建新的Profile對(duì)象。這時(shí)我們就可以自定義create_user_profile和save_user_profile兩個(gè)監(jiān)聽函數(shù),同時(shí)監(jiān)聽sender(User模型)發(fā)出的post_save信號(hào)。由于post_save可同時(shí)用于模型的創(chuàng)建和更新,我們用if created這個(gè)判斷來(lái)加以區(qū)別。

from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver

class 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常用內(nèi)置信號(hào)

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

  • django.db.models.signals.pre_save & post_save在模型調(diào)用 save()方法之前或之后發(fā)送。
  • django.db.models.signals.pre_init& post_init在模型調(diào)用_init_方法之前或之后發(fā)送。
  • django.db.models.signals.pre_delete & post_delete在模型調(diào)用delete()方法或查詢集調(diào)用delete() 方法之前或之后發(fā)送。
  • django.db.models.signals.m2m_changed在模型多對(duì)多關(guān)系改變后發(fā)送。
  • django.core.signals.request_started & request_finished Django建立或關(guān)閉HTTP 請(qǐng)求時(shí)發(fā)送。

如何正確放置Django信號(hào)的監(jiān)聽函數(shù)代碼

在之前案例中,我們將Django信號(hào)的監(jiān)聽函數(shù)寫在了models.py文件里。當(dāng)一個(gè)app的與信號(hào)相關(guān)的自定義監(jiān)聽函數(shù)很多時(shí),此時(shí)models.py代碼將變得非常臃腫。一個(gè)更好的方式把所以自定義的信號(hào)監(jiān)聽函數(shù)集中放在app對(duì)應(yīng)文件夾下的signals.py文件里,便于后期集中維護(hù)。

假如我們有個(gè)account的app,包含了User和Pofile模型,我們不僅需要在account文件夾下新建signals.py,還需要修改account文件下apps.py和__init__.py,以導(dǎo)入創(chuàng)建的信號(hào)監(jiān)聽函數(shù)。

# account/signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from .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 AppConfig

class AccountConfig(AppConfig):
    name = 'account'

    def ready(self):
        import account.signals

# account/__init__.py

default_app_config = 'account.apps.AccountConfig'

小結(jié)

在本文里我們總結(jié)了Django信號(hào)(signals)的工作原理,介紹了如何使用Django信號(hào)實(shí)現(xiàn)模型或程序的聯(lián)動(dòng)。最后我們還總結(jié)了Django常用內(nèi)置信號(hào)以及如何正確放置自定義的信號(hào)監(jiān)聽函數(shù)。歡迎關(guān)注我們更多Python Web開發(fā)和Django原創(chuàng)文章。

以上就是正確的理解和使用Django信號(hào)(Signals)的詳細(xì)內(nèi)容,更多關(guān)于Django信號(hào)(Signals)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python 實(shí)現(xiàn)上傳圖片并預(yù)覽的3種方法(推薦)

    python 實(shí)現(xiàn)上傳圖片并預(yù)覽的3種方法(推薦)

    下面小編就為大家?guī)?lái)一篇python 實(shí)現(xiàn)上傳圖片并預(yù)覽的3種方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 利用python實(shí)現(xiàn)后端寫網(wǎng)頁(yè)(flask框架)

    利用python實(shí)現(xiàn)后端寫網(wǎng)頁(yè)(flask框架)

    這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)后端寫網(wǎng)頁(yè)(flask框架)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 用python寫爬蟲簡(jiǎn)單嗎

    用python寫爬蟲簡(jiǎn)單嗎

    在本篇內(nèi)容里小編給大家整理的是關(guān)于用python寫爬蟲是否簡(jiǎn)單的相關(guān)內(nèi)容文章,需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • python讀取一個(gè)大于10G的txt文件的方法

    python讀取一個(gè)大于10G的txt文件的方法

    讀取文件是一個(gè)常用的功能,那么如何用python 讀取一個(gè)大于10G 的文件,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 如何修改numpy?array的數(shù)據(jù)類型

    如何修改numpy?array的數(shù)據(jù)類型

    這篇文章主要介紹了如何修改numpy?array的數(shù)據(jù)類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能

    pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能

    這篇文章主要為大家詳細(xì)介紹了pyside+pyqt實(shí)現(xiàn)鼠標(biāo)右鍵菜單功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • python requests抓取one推送文字和圖片代碼實(shí)例

    python requests抓取one推送文字和圖片代碼實(shí)例

    這篇文章主要介紹了python requests抓取one推送文字和圖片代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python構(gòu)建簡(jiǎn)單線性回歸模型

    Python構(gòu)建簡(jiǎn)單線性回歸模型

    這篇文章主要介紹了Python構(gòu)建簡(jiǎn)單線性回歸模型,線性回歸表示發(fā)現(xiàn)函數(shù)使用線性組合表示輸入變量。簡(jiǎn)單線性回歸很容易理解,使用了基本的回歸技術(shù),一旦理解了這些基本概念,可以更好地學(xué)習(xí)其他類型的回歸模型
    2022-08-08
  • python登錄豆瓣并發(fā)帖的方法

    python登錄豆瓣并發(fā)帖的方法

    這篇文章主要介紹了python登錄豆瓣并發(fā)帖的方法,涉及URL模擬登陸及cookie的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Pycharm中import torch報(bào)錯(cuò)的快速解決方法

    Pycharm中import torch報(bào)錯(cuò)的快速解決方法

    這篇文章主要介紹了Pycharm中import torch報(bào)錯(cuò)的快速解決方法,很多朋友容易碰到這個(gè)問(wèn)題,今天小編特此把解決方案分享到腳本之家平臺(tái)供大家參考,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

米易县| 石门县| 英山县| 葵青区| 金寨县| 哈密市| 汾西县| 乌审旗| 怀来县| 榆社县| 安达市| 阳城县| 大同市| 镶黄旗| 斗六市| 饶河县| 绥中县| 曲周县| 乳源| 哈密市| 黎平县| 轮台县| 潼南县| 宣汉县| 盘山县| 攀枝花市| 酒泉市| 雷波县| 锡林浩特市| 仙游县| 乐安县| 秦皇岛市| 都匀市| 垣曲县| 商河县| 镇安县| 新建县| 红河县| 长海县| 垫江县| 太白县|