版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Burgess_zheng/article/details/86747225
上一篇:Django之自定制中间件及实战示例(其他篇七)点击跳转
目录篇:Django之其他目录篇 点击跳转
目录
信号简介
简单理解:对每条执行的代码的前后都留了位置自定义操作,如:进行数据存储的前后可以执行我们自定义的操作等等....
注意:装饰器到函数,可以做到所有保存数据前后进行操作,但是无法做到细化单个指定进行保存数据前后操作(细化到指定需要改装饰源码,不符合开发规范)
Django内置信号
Model signals
pre_init # django的modal执行其构造方法前,自动触发
post_init # django的modal执行其构造方法后,自动触发
pre_save # django的modal对象保存前,自动触发
post_save # django的modal对象保存后,自动触发
pre_delete # django的modal对象删除前,自动触发
post_delete # django的modal对象删除后,自动触发
m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
pre_migrate # 执行migrate命令前,自动触发
post_migrate # 执行migrate命令后,自动触发
Request/response signals
request_started # 请求到来前,自动触发
request_finished # 请求结束后,自动触发
got_request_exception # 请求异常后,自动触发
Test signals
setting_changed # 使用test测试修改配置文件时,自动触发
template_rendered # 使用test测试渲染模板时,自动触发
Database Wrappers
connection_created # 创建数据库连接时,自动触发
实战示例
1.创建Django项目
Django之创建项目【二】:https://blog.csdn.net/Burgess_zheng/article/details/86505526
2.定制Django内置信号
django文件路径:project_burgess/sg.py
__author__ = "Burgess Zheng" from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exception from django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created def f1(sender, **kwargs): #sender形参 ,**kwargs关键形参 接收源码的实参 print("触发信号:f1(用户请求前执行)") #print(sender,kwargs) request_started.connect(f1) #表示把f1函数注册到了request_started信号里面 #这样用户请求来了就会先执行该f1函数
project_burgess/project_burgess/__init__.py
import sg
4.定义url
路径:project_burgess/project_burgess/urls.py
from django.contrib import admin from django.urls import path,re_path #Django版本2.0以上 from project_burgess import views from django.conf.urls import url #Django2.0 from django.conf.urls import include urlpatterns = [ path('admin/', admin.site.urls), path('sg/', views.sg), # 最新版本的Django路由使用path # url(r'^sg/', views.sg), #2.0版本使用的是url ]
4.定义URL相关函数
路径:project_burgess/project_burgess/views
__author__ = "Burgess Zheng" #!/usr/bin/env python #-*- coding:utf-8 -*- from django.shortcuts import render,HttpResponse,redirect def sg(request): print('处理用户的请求') return HttpResponse('OK')
5.浏览器访问结果
get请求
查看后台
6.自定制信号(主动触发)
django内置信号可能满足不了我们的需求(所以支持自定义信号)
自定义信号,需要三步:1.创建(定义)信号 2.注册函数 3主动触发信号django文件路径:project_burgess/sg.py
__author__ = "Burgess Zheng" from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exception from django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created ''' def f1(sender, **kwargs): #sender形参 ,**kwargs关键形参 接收源码的实参 print("触发信号:f1(用户请求前执行)") #print(sender,kwargs) request_started.connect(f1) #表示把f1函数注册到了request_started信号里面 #这样用户请求来了就会先执行该f1函数 ''' #创建自定义信号 import django.dispatch self_register = django.dispatch.Signal(providing_args=["name", "sex"]) #要求成形参数量 #注册信号 def callback(sender, **kwargs): print("自定制的信号") print(sender, kwargs) self_register.connect(callback)
url对应函数进行主动触发信号
路径:project_burgess/project_burgess/views
__author__ = "Burgess Zheng" #!/usr/bin/env python #-*- coding:utf-8 -*- from django.shortcuts import render,HttpResponse,redirect def sg(request): print('处理用户的请求') from sg import self_register self_register.send(sender='xx',name='burgess',sex='男',) return HttpResponse('OK')
get请求
查看后台
其实主动触发有什么用能?这样写和函数没区别
但是还是有应用场景,在函数里面做个判断如果CUP达到某个高点的时候,或者什么东西出错的时候就触发该信号,然后该信号的注册函数执行发送短信
短信贵了 注册函数就该发微信,就不用动到函数的代码