Django中信号的使用

信号种类及用法

Django中提供了”信号调度”,用于在框架执行操作时解耦.

一些动作发生的时候,系统会根据信号定义的函数执行相应的操作

Django中内置的signal

Model_signals

pre_init                        # Django中的model对象执行其构造方法前,自动触发
post_init                       # Django中的model对象执行其构造方法后,自动触发
pre_save                        # Django中的model对象保存前,自动触发
post_save                       # Django中的model对象保存后,自动触发
pre_delete                      # Django中的model对象删除前,自动触发
post_delete                     # Django中的model对象删除后,自动触发
m2m_changed                     # Django中的model对象使用m2m字段操作数据库的第三张表(add,remove,clear,update),自动触发
class_prepared                  # 程序启动时,检测到已注册的model类,对于每一个类,自动触发

Managemeng_signals

pre_migrate                     # 执行migrate命令前,自动触发
post_migrate                    # 执行migrate命令后,自动触发

Request/response_signals

request_started                 # 请求到来前,自动触发
request_finished                # 请求结束后,自动触发
got_request_exception           # 请求异常时,自动触发

Test_signals

setting_changed                 # 配置文件改变时,自动触发
template_rendered               # 模板执行渲染操作时,自动触发

Datebase_Wrapperd

connection_created              # 创建数据库连接时,自动触发

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,系统会自动触发注册函数

例子,创建数据库记录,触发 pre_savepost_save信号

创建一个Django项目,配置好路由映射

models.py中的代码:

from django.db import models

class Book(models.Model):
    name=models.CharField(max_length=32)
    price=models.CharField(max_length=64)

views.py中的代码:

from django.shortcuts import render,HttpResponse
from app01 import  models

def index(request):
    models.Book.objects.create(name="xxx",price="123")
    return HttpResponse("ok")

方法一:项目的 __init__.py文件中代码:

from django.db.models.signals import pre_save,post_save

def pre_save_func(sender,**kwargs):

    print("pre_save_func")
    print("pre_save_msg:",sender,kwargs)

def post_save_func(sender,**kwargs):
    print("post_save_func")
    print("post_save_msg:",sender,kwargs)

pre_save.connect(pre_save_func)             # models对象保存前触发callback函数
post_save.connect(post_save_func)           # models对象保存后触发函数

创建一个 index.html网页,用浏览器打开这个项目,在服务端后台打印信息如下:

pre_save_func
pre_save_msg:  {'signal': ,
'instance': , 'raw': False, 'using': 'default', 'update_fields': None}

post_save_func
post_save_msg:  {'signal': ,
'instance': , 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

比较打印的结果,可以看到models对象保存后,在打印信息里包含一个 "create=True"的键值对.

方法二(推荐):也可以使用装饰器来触发信号,把上面 __init__.py中的代码修改:

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

@receiver(post_save)
def create_user(sender, instance, created, **kwargs):
    if created:
        print(sender)  #
        print(instance)  # Book object (17)
        print(created)  # True
        print(kwargs)  # {'signal': , 'update_fields': None, 'raw': False, 'using': 'default'}

应用场景

用信号可以解决redis和mysql双写一致性问题,当mysql的数据新增了,在信号里把缓存删除就行了,就保证了redis和mysql的数据一致

Original: https://www.cnblogs.com/zonghan/p/16282402.html
Author: zong涵
Title: Django中信号的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611336/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【持久层框架】- SpringData-JPA

    SpringData – JPA 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学习心得…

    Linux 2023年6月6日
    081
  • 软件工程 统一建模语言(Unified Modeling Language UML) 第4篇随笔

    是一种可视化的语言 规约系统的制品 构造系统的制品 建立系统制品的文档 UML应用范围 可用于对象方法和构件方法 可用于所有应用领域和不同的平台 1.面向对象方法术语/符号 主要有…

    Linux 2023年6月7日
    0126
  • 数据库性能优化八大方案,你知道几个

    前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。 如果我们有一套成熟的方法论,能让大家快速、准确的去选择…

    Linux 2023年6月13日
    077
  • SpringBoot 2.1.9 整合 Redisson分布式锁

    官方参考文档 redisson-spring-boot-starter 官方文档 通过YAML文件配置单节点模式 一)、引入Redisson整合Spring Boot依赖 二)、通…

    Linux 2023年5月28日
    0111
  • 简单动态页面的爬取

    ch6&7 动态渲染页面的爬取 ajax数据爬取 动态渲染页面的爬取 selenium的使用 splash的使用 1. ajax数据爬取 ajax数据的爬取主要依靠分析XH…

    Linux 2023年6月7日
    0107
  • phpcms安装

    【快速安装开始】 下载解压phpcms,复制安装文件到站点目录”/opt/html”里,给予权限(官网无法访问了,所以下载地址需自行寻找上传) cd /us…

    Linux 2023年6月6日
    083
  • ingress-nginx 部署使用

    安装部署 nginx-ingress-controller 输入下面网址:选择版本 https://github.com/kubernetes/ingress-nginx/blob…

    Linux 2023年6月14日
    0102
  • 七种方案!探讨Redis分布式锁的正确使用姿势

    日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的…

    Linux 2023年5月28日
    093
  • js学习笔记——条件 循环

    今天发现之前学的爱前端的课中JS部分函数等不全,果断换了一个课——渡一的《Web前端开发JavaScript高薪课堂》接着学习,不过废话有点多 语法:1、单if,条件成立,执行语句…

    Linux 2023年6月13日
    078
  • neovim环境与vim简单使用

    Github仓库 neovim的配置 这里列出我自己使用的 init.vim,如果插件无法安装,请按照github仓库中给出的解决方法解决(手动clone安装即可)。参考了gith…

    Linux 2023年6月8日
    0111
  • Git

    什么是Git Git是用C语言开发的分布式版本控制系统,所谓版本控制系统,就是可以储存一个文件在不同时间的版本,记录每次文件的改动,可以根据需要,随时切换到之前的版本(比如在编写W…

    Linux 2023年6月7日
    0106
  • LVM逻辑卷与磁盘配额

    一、LVM逻辑卷 1、LVM概述 LVM(Logical Volume Manager,逻辑卷管理)重点在于可以弹性地调整文件系统的容量,需要文件的读写性能或是数据的可靠性,LVM…

    Linux 2023年6月6日
    0110
  • 运算符重载和深浅拷贝

    对于某些运算符号(+,-,,/….),我们不满足与它原有的操作方式,而是要在对 特有对象(如负数的加减)进行使用,但是编译器会不允许这样做,因为会与操作符 原本的类型不…

    Linux 2023年6月7日
    0102
  • MSSQL中Repalce函数处理长字符串时报异常的解决方案

    阅文时长 | 17.99分钟字数统计 | 28788.8字符主要内容 | 1、引言&背景 2、问题还原 3、解决方案 4、官方解释 5、声明与参考资料『MSSQL中Repa…

    Linux 2023年6月14日
    083
  • Cause: java.lang.ClassNotFoundException: Cannot find class: Studen

    Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type…

    Linux 2023年6月7日
    0114
  • 数据结构和算法的关系

    针对Python数据结构与算法(裘宗燕版)中的第一章绪论最后的问题 数据结构 概念 数据与数据之间的结构关系(数组、队列、树、图等结构) 类别 分为 逻辑数据结构和 存储数据结构两…

    Linux 2023年6月7日
    0158
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球