欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 正確的理解和使用Django信號(Signals)

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

熱門標簽:看懂地圖標注方法 佛山通用400電話申請 京華圖書館地圖標注 蘇州人工外呼系統軟件 電話機器人貸款詐騙 淮安呼叫中心外呼系統如何 打印谷歌地圖標注 廣東旅游地圖標注 電話外呼系統招商代理

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 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的方法將自定義的函數與信號發出者(sender)User模型進行了連接。在實際應用中一個更常用的方式是使用@receiver裝飾器實現發送者與監聽函數的連接,如下所示。@receiver(post_save, sender=User)讀起來的意思就是監聽User模型發出的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信號實現不同模型的聯動更新

我們再來看一個復雜一點的例子。我們有一個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 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()方法后才發送信號。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_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信號實現模型或程序的聯動。最后我們還總結了Django常用內置信號以及如何正確放置自定義的信號監聽函數。歡迎關注我們更多Python Web開發和Django原創文章。

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

您可能感興趣的文章:
  • 3分鐘看懂Python后端必須知道的Django的信號機制
  • 基于Django signals 信號作用及用法詳解
  • Django框架 信號調度原理解析
  • django 信號調度機制詳解
  • Django中信號signals的簡單使用方法
  • 深入理解Django-Signals信號量
  • 深入理解Django自定義信號(signals)
  • 利用信號如何監控Django模型對象字段值的變化詳解
  • Django的信號機制詳解

標簽:股票 呼和浩特 衡水 江蘇 湖州 駐馬店 畢節 中山

巨人網絡通訊聲明:本文標題《正確的理解和使用Django信號(Signals)》,本文關鍵詞  正確,的,理解,和,使用,Django,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《正確的理解和使用Django信號(Signals)》相關的同類信息!
  • 本頁收集關于正確的理解和使用Django信號(Signals)的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    免费三级欧美电影| 国产麻豆xxxvideo实拍| 又嫩又硬又黄又爽的视频| 日韩欧美高清dvd碟片| 亚洲成av人影院| 日本美女视频网站| 欧美人与禽zozo性伦| 亚洲综合精品久久| 日本精品一二三| 91精品午夜视频| 日韩av网站免费在线| 国产熟妇搡bbbb搡bbbb| 日韩精品一区国产麻豆| 精品一区二区三区日韩| 亚洲第一视频区| 国产精品污污网站在线观看| 国产aⅴ综合色| 国产性xxxx| 一级女性全黄久久生活片免费| 91在线小视频| 欧美顶级少妇做爰| 免费在线欧美视频| 337人体粉嫩噜噜噜| 中文一区一区三区高中清不卡| 成a人片亚洲日本久久| 欧美在线不卡视频| 午夜av一区二区| 午夜在线观看一区| 国产精品拍天天在线| 99re视频精品| 8v天堂国产在线一区二区| 美女视频一区在线观看| 任你操精品视频| 亚洲精品国产成人久久av盗摄| zjzjzjzjzj亚洲女人| 精品国产在天天线2019| 粉嫩13p一区二区三区| 欧美色视频在线观看| 日本在线不卡视频一二三区| 你懂得视频在线观看| 亚洲视频免费观看| 国产 中文 字幕 日韩 在线| 久久品道一品道久久精品| 成人黄色电影在线 | 天天综合天天做天天综合| 成人免费看aa片| 国产精品日韩成人| a级片在线观看视频| 久久久久久99精品| 91碰在线视频| 精品国产凹凸成av人导航| 大尺度一区二区| 制服.丝袜.亚洲.中文.综合| 国产精品一区二区久久精品爱涩 | 色又黄又爽网站www久久| 亚洲成人综合视频| 手机免费观看av| 亚洲国产精品一区二区久久恐怖片 | 永久免费看片在线观看| 欧美不卡激情三级在线观看| 岛国精品在线观看| 日韩午夜在线播放| a4yy欧美一区二区三区| 精品国产免费人成在线观看| 91在线码无精品| 久久亚洲一区二区三区四区| 91日韩精品一区| 国产亚洲一区二区三区四区 | av电影在线不卡| 一区二区三区四区不卡视频| 影音先锋男人在线| 亚洲成人av福利| 希岛爱理中文字幕| 麻豆91在线观看| 欧美日韩小视频| 成人午夜视频网站| 精品福利av导航| 丰满熟女人妻一区二区三区| 中文字幕+乱码+中文字幕一区| 欧美做受喷浆在线观看| 一区二区三区日韩精品视频| 国精品人伦一区二区三区蜜桃| 婷婷久久综合九色国产成人| 91久久一区二区| 国产成人综合视频| 精品国产成人在线影院| 国产伦精品一区二区三区88av| 国产精品毛片高清在线完整版| 色无极影院亚洲| 夜夜嗨av一区二区三区四季av| 5566中文字幕| 激情文学综合丁香| 日韩午夜在线观看视频| 性生交大片免费看l| 国产精品久久久久久久久搜平片 | 国产日产亚洲精品系列| 一本色道综合久久欧美日韩精品 | 欧美三级日本三级| 国产九色精品成人porny| 日韩精品一区二区三区视频 | 一起草最新网址| 中文字幕一区在线观看视频| jizzjizzjizz国产| 狠狠色丁香久久婷婷综合丁香| 日韩欧美高清dvd碟片| 大桥未久恸哭の女教师| 一二三区精品视频| 在线亚洲人成电影网站色www| 成人理论电影网| 国产精品嫩草影院av蜜臀| 青青青视频在线免费观看| 黄色小说综合网站| 精品国内二区三区| a天堂中文字幕| 久久99日本精品| 精品国产不卡一区二区三区| 加勒比一区二区| 麻豆专区一区二区三区四区五区| 日韩欧美一二三| 亚洲av无码成人精品国产| 日本视频一区二区| 日韩精品一区二区三区视频在线观看 | 国产不卡视频在线播放| 中文字幕第一区综合| 黄色录像免费观看| 成人高清免费观看| 亚洲欧洲中文日韩久久av乱码| 日韩在线中文字幕视频| 不卡视频在线看| 亚洲欧美视频在线观看| 在线观看免费亚洲| 亚洲精品乱码久久久久久蜜桃欧美| 亚洲第一主播视频| 日韩午夜av电影| 午夜在线观看一区| 国产精品69毛片高清亚洲| 国产精品视频在线看| 欧美卡一卡二卡三| 无码国产精品一区二区高潮| 亚洲成人自拍偷拍| 日韩亚洲欧美在线观看| 中文字幕网站在线观看| 国产传媒久久文化传媒| 自拍偷拍国产亚洲| 欧美日韩久久久| 麻豆av免费观看| 国产成人欧美日韩在线电影 | 天天操天天摸天天舔| 成人高清av在线| 亚洲国产日韩a在线播放| 日韩三级精品电影久久久 | 久久久久亚洲av片无码v| 亚洲成人免费视| 精品国产在天天线2019| 国产成人av免费在线观看| 欧美熟妇另类久久久久久多毛| 视频一区中文字幕| 久久久久久久免费视频了| 成人免费毛片东京热| 久草视频福利在线| 经典一区二区三区| 亚洲视频你懂的| 日韩一区二区免费视频| 国产中文字幕久久| 亚洲天堂小视频| 久久97超碰色| 亚洲精品视频免费看| 日韩欧美久久久| 国产成人自拍网站| 久久久国产精品无码| 国产高清精品久久久久| 亚洲图片欧美一区| 国产午夜精品久久久久久免费视| 在线影视一区二区三区| 中文字幕国产专区| 99综合电影在线视频| 美国十次综合导航| 亚洲日本免费电影| 亚洲精品一区二区三区四区高清| 色欲综合视频天天天| 欧美亚一区二区三区| av一区二区三区黑人| 蜜臀精品一区二区三区在线观看 | 91丝袜呻吟高潮美腿白嫩在线观看| 日韩成人免费电影| 亚洲少妇中出一区| 精品国产不卡一区二区三区| 91高清视频免费看| 一级片久久久久| 亚洲成a人片在线www| 国产成人av一区二区三区在线 | 欧美疯狂做受xxxx富婆| 欧美爱爱免费视频| 毛片网站免费观看| 人妻巨大乳一二三区| 国产成人亚洲综合a∨猫咪| 天天操天天干天天综合网| 中文字幕一区二区5566日韩| 日韩午夜激情电影| 欧美日韩综合不卡|