Django中内置的signal

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

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

Model_signals

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

Managemeng_signals

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

Request/response_signals

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

Test_signals

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

Datebase_Wrapperd

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

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

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

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

models.py中的代码:

  1. from django.db import models
  2.  
  3. class UserInfo(models.Model):
  4. name=models.CharField(max_length=32)
  5. pwd=models.CharField(max_length=64)

views.py中的代码:

  1. from django.shortcuts import render,HttpResponse
  2. from app01 import models
  3.  
  4. def index(request):
  5. models.UserInfo.objects.create(name="mysql",pwd="mysql123")
  6. return HttpResponse("ok")

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

  1. from django.db.models.signals import pre_save,post_save
  2.  
  3. def pre_save_func(sender,**kwargs):
  4.  
  5. print("pre_save_func")
  6. print("pre_save_msg:",sender,kwargs)
  7.  
  8. def post_save_func(sender,**kwargs):
  9. print("post_save_func")
  10. print("post_save_msg:",sender,kwargs)
  11.  
  12. pre_save.connect(pre_save_func) # models对象保存前触发callback函数
  13. post_save.connect(post_save_func) # models对象保存后触发函数

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

  1. pre_save_func
  2. pre_save_msg: <class 'app01.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000000002E62588>,
  3. 'instance': <UserInfo: UserInfo object>, 'raw': False, 'using': 'default', 'update_fields': None}
  4.  
  5. post_save_func
  6. post_save_msg: <class 'app01.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000000002E62630>,
  7. 'instance': <UserInfo: UserInfo object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

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

也可以使用装饰器来触发信号,把上面__init__.py中的代码修改:

  1. from django.core.signals import request_finished
  2. from django.dispatch import receiver
  3.  
  4. @receiver(request_finished)
  5. def callback(sender, **kwargs):
  6. print("Request finished!")

则在本次请求结束后自动触发callback函数,在后台打印"Request finished!"这句话.

自定义信号

1.定义信号

新建一个项目,配置好路由,在项目根目录下创建一个singal_test.py的文件,内容为

  1. import django.dispatch
  2.  
  3. action=django.dispatch.Signal(providing_args=["aaaa","bbbb"])

2.注册信号

项目应用下面的__init__.py文件内容:

  1. from singal_test import action
  2.  
  3. def pre_save_func(sender,**kwargs):
  4.  
  5. print("pre_save_func")
  6. print("pre_save_msg:",sender,kwargs)
  7.  
  8. action.connect(pre_save_func)

3.触发信号

views视图函数内容:

  1. from singal_test import action
  2.  
  3. action.send(sender="python",aaa="",bbb="")

用浏览器打开index.html网页,后台打印信息如下:

  1. pre_save_func
  2. pre_save_msg: python {'signal': <django.dispatch.dispatcher.Signal object at 0x000000000391D710>, 'aaa': '', 'bbb': ''}

由于内置信号的触发者已经集成到Django中,所以会自动调用,而对于自定义信号需要在任意位置触发

Django内置信号的更多相关文章

  1. django 内置“信号”机制和自定义方法

    一.引子 在操作数据的时候,假设我们需要记录一些日志,这个时候,我们需要用什么来显示这个需求呢?装饰器?装饰器只能先实现整体的操作.在django 里面有这么一个东西--信号 下面我们就来了解了解它. ...

  2. Django缓存和内置信号

    缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时 ...

  3. Django内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  4. Django内置分页

    一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...

  5. Django 内置分页器

    先导入Django内置的分页器 在商品列表页或者购物车列表页导入 在渲染list.html导入 然后在views后台渲染方法写入 打开list页面结果

  6. Django内置权限扩展案例

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...

  7. Django内置模版过滤器

    Django内置过滤器总览 可以查询下表来总览Django的内置过滤器: 过滤器 说明 add 加法 addslashes 添加斜杠 capfirst 首字母大写 center 文本居中 cut 切除 ...

  8. Django内置模板标签

    Django内置标签总览 可以查询下表来总览Django的内置标签: 标签 说明 autoescape 自动转义开关 block 块引用 comment 注释 csrf_token CSRF令牌 cy ...

  9. Django内置过滤器详解附代码附效果图--附全部内置过滤器帮助文档

    前言 基本环境 Django版本:1.11.8 Python版本:3.6 OS: win10 x64 本文摘要 提供了常用的Django内置过滤器的详细介绍,包括过滤器的功能.语法.代码和效果示例. ...

随机推荐

  1. 阿里云配置redis

    一.redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...

  2. JavaScript非阻塞加载脚本

    As more and more sites evolve into “Web 2.0″ apps, the amount of JavaScript increases. This is a per ...

  3. mysql jdbc 连接url

    jdbc url连接地址格式: jdbc:mysql://[host][,failoverhost...][:port]/[database] [?propertyName1][=propertyVa ...

  4. 《时间序列分析及应用:R语言》读书笔记--第一章 引论

    "春节假期是难得的读书充电的时间."--来自某boss.假期能写多少算多少,一个是题目中的这本书,另一个是<python核心编程>中的高级部分,再一个是拖着的<算 ...

  5. STL使用总结

    转载于http://blog.csdn.net/daisy_chenting/article/details/6898184 1.    概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可 ...

  6. Ultra-QuickSort POJ - 2299 树状数组求逆序对

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...

  7. C++派生类继承的理解

    #include<iostream> using namespace std; class Base{ public: Base() { a=; cout<<"Bas ...

  8. STM32串口发送第一个字符丢失解决之道

    stm32用printf函数重定向到串口USART1发现第一个字符没打印出来具体如下: 刚开始修改fputc函数如下: int fputc(int ch,FILE *f){USART_SendData ...

  9. mysql 添加字段 修改字段为not null

    添加一个字段 ALTER TABLE jw_user_role ADD zk_env VARCHAR(16); 修改字段为not null,还要把原来的类型也写出来 ALTER TABLE jw_us ...

  10. vijos 1037 背包+标记

    描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块 ...