"""
在web开发中, 你可能会遇到下面这种场景:
在用户完成某个操作后, 自动去执行一些后续的操作. 譬如用户完成修改密码后,你要发送一份确认邮件 观察者模式:观察者模式(Observer)完美的将观察者和被观察的对象分离开。
举个例子,用户界面可以作为一个观察者,业务数据是被观察者,
用户界面观察业务数据的变化,发现数据变化后,就显示在界面上
""" """学习网站https://simpleisbetterthancomplex.com/tutorial/2016/07/28/how-to-create-django-signals.html""" """两个重要的对象:Sender receiver
sender dispatch a signal, receiver receive signal and do something
sender 是一个object, receiver是一个方法,或者对象的方法
将sender和receiver关联起来是通过signal dispatchers, 即Signal.connect()方法来关联sender,receiver
""" # post_save信号
""" 在mode对象执行save函数时,就会触发该信号""" from django.contrib.auth.models import User
from django.db.models.signals import post_save def save_profile(sender, instance, **kwargs):
instance.profile.save() post_save.connect(save_profile, sender=User) # save_profile是receiver,User是sender, post_save是signal, 上面代码可以理解成:当User对象执行save函数后,就会执行save_profile函数 # 如果去掉post_save.connect的sender参数,如: post_save.connect(save_profile), 则就是任意一个model执行了save函数,都会调用save_profile函数 """关联sender和receiver还可以通过@receiver装饰器来完成 def receiver(signal, **kwargs)"""
# 两个参数,signal可以是元组或者列表,或者单个信号
# **kwargs是位置参数,注意 from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver @receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save() # 注册信号不应该在app的models或者根目录,django建议我们将signals放到config里面,以下面为了,profile为一个app;cmdbox是project # profile/signals.py
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver from cmdbox.profiles.models import 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() """ instance参数就是sender的实例化对象""" #profiles/app.py:
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _ class ProfilesConfig(AppConfig):
name = 'cmdbox.profiles'
verbose_name = _('profiles') def ready(self):
import cmdbox.profiles.signals # noqa # profiles/__init__.py: 如果已经在工程里面注册了app,这里是不需要的
default_app_config = 'cmdbox.profiles.apps.ProfilesConfig' # 如果是通过connect关联sender和receiver,参考下面代码 # profile/signals.py
from cmdbox.profiles.models import Profile def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance) def save_user_profile(sender, instance, **kwargs):
instance.profile.save() # profile/app.py
from django.apps import AppConfig
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.utils.translation import ugettext_lazy as _ from cmdbox.profiles.signals import create_user_profile, save_user_profile class ProfilesConfig(AppConfig):
name = 'cmdbox.profiles'
verbose_name = _('profiles') def ready(self):
post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User) # profiles/__init__.py:
default_app_config = 'cmdbox.profiles.apps.ProfilesConfig'
 

[ecmagnet][django] 如何使用django的signal的更多相关文章

  1. 第六章:Django 综合篇 - 8:信号 signal

    django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...

  2. Django组件(五) Django之ContentType组件

    基础使用 -contenttype组件 -django提供的一个快速连表操作的组件,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中. 当我们的项目做数据迁移后,会 ...

  3. 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...

  4. 【Django】Django 如何使用 Django设置的日志?

    代码: from django.core.management.base import BaseCommand, CommandError from django.db import models # ...

  5. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  6. [Django高级]理解django中的中间件机制和执行顺序

    原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu. 注:middlewa ...

  7. Python Django 1.Hello Django

    #安装Djangopip install Django #==版本号#选择路径:D:#任意文件夹名 cd Django #罗列Django所提供的命令,其中startproject命令来创建项目 dj ...

  8. Django学习之django自带的contentType表 GenericRelation GenericForeignKey

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  9. Django项目和Django初体验和创建、目录结构认识

    .MVC的设计方式(跟Flask一样,都是MVC的设计模式) .开发效率高 .功能强大(丰富的第三方组件) .安全性高(帮助开发者规避安全漏洞) 目前市面上使用:Django>Flask #使用 ...

  10. Django框架 (七) Django ORM模型

    ORM简介 查询数据层次图解:如果操作mysql,ORM是在pymysq之上又进行了一层封装

随机推荐

  1. js,h5页面判断客户端是ios还是安卓

    $(function(){ var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('An ...

  2. 手把手教你玩转 CSS3 3D 技术

    css3的3d起步 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(translate).透视即是以现实的视角来看屏幕上的2D事物,从而展现3 ...

  3. npm ERR! code: 'EPERM' (权限问题 errro permit)

    PS C:\Users\user\Desktop\test\my-project> npm run iview --save npm ERR! missing script: iview npm ...

  4. Mit6.824 Lab1-MapReduce

    前言 Mit6.824 是我在学习一些分布式系统方面的知识的时候偶然看到的,然后就开始尝试跟课.不得不说,国外的课程难度是真的大,一周的时间居然要学一门 Go 语言,然后还要读论文,进而做MapRed ...

  5. js-关于iframe:从子页面给父页面的控件赋值方法

    项目中我们经会用到iframe,可能还会把iframe里的数值赋值给父页面空间. 接下来我们来说说有关于iframe赋值给父页面的方法. 1.子页面iframe给父页面的控件赋值方法. parent. ...

  6. Oracle数据库远程访问

    如果需要访问非本机的Oracle数据库,首先需要安装一个Oracle的客户端,我直接安装的服务器版本的Oracle,也自带客户端. 安装完成后,如果访问本机的服务器的话,直接就可以访问,无需配置, 如 ...

  7. phpstudy apache启动失败,80端口占用问题解决方案

    安装phpstydy,启动apache时,启动失败,提示80端口占用,需要将占用80端口的服务进程关闭 1.运行cmd, netstat -ano 找到80端口对应的pid  4 2.一般都是调用 h ...

  8. flask 中访问时后台错误 error: [Errno 32] Broken pipe

    解决办法:app.run(threaded=True) 个人理解:flask默认单线程,访问一个页面时会访问到很多页面,比如一些图片,加入参数使其为多线程

  9. 数据分析处理库Pandas——时间

    时间戳 向后推的时间戳 备注:五天后的时间. 指定日期和时间 时间的Series结构 按要求显示时间(开始时间,时间间隔,时间个数) 转换为时间格式,并设置时间列为索引列 方法一 方法二 筛选显示 方 ...

  10. 多线程编程之Apue3rd_Chapter11之互斥锁_读写锁_自旋锁

    学习了apue3rd的第11章,主要讲的是多线程编程.因为线程共享进程的资源比如堆和全局变量,多线程编程最重要的是,使用各种锁进行线程同步. 线程编程首先要学习的三个函数如下: #include &l ...