Django之信号及实战示例(其他篇八)

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 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达到某个高点的时候,或者什么东西出错的时候就触发该信号,然后该信号的注册函数执行发送短信
短信贵了 注册函数就该发微信,就不用动到函数的代码

上一篇:Django之自定制中间件及实战示例(其他篇七)点击跳转
目录篇:Django之其他目录篇 点击跳转

猜你喜欢

转载自blog.csdn.net/Burgess_zheng/article/details/86747225