django进阶(十二)之信号

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

相当于我们创建了一个hook。

内置信号

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)前后,自动触发
    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 # 创建数据库连接时,自动触发

 

示例

#!/usr/bin/env python
#-*- coding:utf-8 -*-

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 test_singal(sender, **kwargs):
    print("test_singal_function")
    #print(sender,kwargs)

request_started.connect(test_singal) # request_started 指上述导入的内容,test_singal为函数名

 

首先加载到内存(也可以在views里导入)

 

 

视图函数views.py

 

由上图执行结果看到,测试成功(表示在执行构造方法之前进行调用)

数据库由专门的数据库信号,详细看上面内置信号

 

自定义信号

想要发送信号,必须先要创建一个信号,在django中,信号是django.dispatch.Signal类的实例,该类的构造函数接受一个名叫providing_args参数,该参数是参数名列表,举例如下:

import django.dispatch

game_start = django.dispatch.Signal(providing_args=['player',  'level'])


有了信号,我们要确定信号是谁发送出去的,这个时候就要用到“`Signal.send(sender, **kwargs)方法了.代码示例如下:

class Game(object):

    def start(self, user, level):

        game_start.send(sender=self.__class__, player=user, level=level)

 

自定义信号流程

  • 首先建一个python文件,定义一个信号,用于创建自定义信号名称及相关函数
  • views里导入文件,触发信号
  • 执行

 

示例

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])##红色为触发者在触发信号的时候传入的参数


def custom_singal(sender, **kwargs):
    print("test_custom_singal")
    print(sender, kwargs)


pizza_done.connect(custom_singal)

 

 视图函数views.py

from singal_test import pizza_done
def cache(request):
    ctime = time.time()

    pizza_done.send(sender="sendd", toppings="toppings", size='123')  ###触发信号,这里参数要与创建信号时的参数相同
    print (ctime)

    #return render(request,'cache.html',{'ctime':ctime})
    return HttpResponse('ok')

 

posted @ 2018-05-03 21:50  FRESHMANS  阅读(134)  评论(0)    收藏  举报