亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

Django信號的一個簡單例子

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

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

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

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信號實現(xiàn)不同模型的聯(lián)動更新

我們再來看一個復雜一點的例子。我們有一個Profile模型,與User模型是一對一的關系。我們希望創(chuàng)建User對象實例時也創(chuàng)建Profile對象實例,而使用post_save更新User對象時不創(chuàng)建新的Profile對象。這時我們就可以自定義create_user_profile和save_user_profile兩個監(jiān)聽函數(shù),同時監(jiān)聽sender(User模型)發(fā)出的post_save信號。由于post_save可同時用于模型的創(chuàng)建和更新,我們用if created這個判斷來加以區(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常用內置信號

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

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

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

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

假如我們有個account的app,包含了User和Pofile模型,我們不僅需要在account文件夾下新建signals.py,還需要修改account文件下apps.py和__init__.py,以導入創(chuàng)建的信號監(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'

小結

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

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

相關文章

  • 詳解如何使用Python的Plotly庫進行交互式圖形可視化

    詳解如何使用Python的Plotly庫進行交互式圖形可視化

    Python中有許多強大的工具和庫可用于創(chuàng)建交互式圖形,其中之一就是Plotly庫,Plotly庫提供了豐富的功能和靈活的接口,使得創(chuàng)建各種類型的交互式圖形變得簡單而直觀,本文將介紹如何使用Plotly庫來創(chuàng)建交互式圖形,需要的朋友可以參考下
    2024-05-05
  • Python如何基于Tesseract實現(xiàn)識別文字功能

    Python如何基于Tesseract實現(xiàn)識別文字功能

    這篇文章主要介紹了Python如何基于Tesseract實現(xiàn)識別文字功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Python爬取APP下載鏈接的實現(xiàn)方法

    Python爬取APP下載鏈接的實現(xiàn)方法

    這篇文章主要實現(xiàn)的是批量下載安卓APP。顯然用手點是不科學的。于是嘗試用Python寫了一個半自動化的腳本。所謂半自動化,就是把下載鏈接批量抓取下來,然后一起貼到迅雷里進行下載,這樣可以快速批量下載。有需要的朋友們可以一起看看吧。
    2016-09-09
  • python 實現(xiàn)將Numpy數(shù)組保存為圖像

    python 實現(xiàn)將Numpy數(shù)組保存為圖像

    今天小編就為大家分享一篇python 實現(xiàn)將Numpy數(shù)組保存為圖像,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python爬蟲之教你如何爬取地理數(shù)據(jù)

    python爬蟲之教你如何爬取地理數(shù)據(jù)

    這篇文章主要介紹了python爬蟲之教你如何爬取地理數(shù)據(jù),文中有非常詳細的代碼示例,對正在學習python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • python高階爬蟲實戰(zhàn)分析

    python高階爬蟲實戰(zhàn)分析

    這篇文章給大家分享了python高階爬蟲實戰(zhàn)的相關實例內容以及技巧分析,有興趣的朋友參考下。
    2018-07-07
  • python中csv文件的若干讀寫方法小結

    python中csv文件的若干讀寫方法小結

    今天小編就為大家分享一篇python中csv文件的若干讀寫方法小結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python監(jiān)控網(wǎng)站運行異常并發(fā)送郵件的方法

    python監(jiān)控網(wǎng)站運行異常并發(fā)送郵件的方法

    這篇文章主要介紹了python監(jiān)控網(wǎng)站運行異常并發(fā)送郵件的方法,涉及Python操作郵件及服務器監(jiān)控的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 使用Python對接OpenAi?API實現(xiàn)智能QQ機器人的方法

    使用Python對接OpenAi?API實現(xiàn)智能QQ機器人的方法

    這篇文章主要介紹了使用Python對接OpenAi?API實現(xiàn)智能QQ機器人的方法,主要是提供一個方法思路,可以根據(jù)實現(xiàn)代碼延申出更多的解決方法,需要的朋友可以參考下
    2023-03-03
  • 利用Pycharm斷點調試Python程序的方法

    利用Pycharm斷點調試Python程序的方法

    今天小編就為大家分享一篇利用Pycharm斷點調試Python程序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11

最新評論