信号

 

django提供一种信号机制,其实就是观察者模式,又叫发布-订阅.当发生一些动作的时候,发出信号,然后就监听了这个信号的函数就会执行.

通俗来讲,就是一些动作的发生的时候,信号允许特定的发送者去提醒,一些接受者,用于在框架执行操作时解耦.

其实说白了就是一个监听的动作,我们的监听动作要执行的话就需要在程序一开始加载的时候就把监听的代码加载上,然后再加载其他的程序的时候就会随时监听到指定的动作.就像我们的pycharm里面要连接上pymysql的时候,需要在django项目里面把项目的根目录里面的init文件里面配置上模块一样的,我们也需要找到项目的根目录然后在里面加上信号的配置代码

信号代码:

init文件里面的配置:(我们这个信号的配置主要监听的就是我们的数据库里面的数据增加操作,对于这个操作,我们如果不用信号的话,在view视图里面加上logging打印也可以达到这个效果,但是我们的视图如果很多的话就需要在每一个视图里面加上logging打印,而在init里面加上配置就有点类似于我们的中间件操作,是对于全局的操作,把init配置好之后,就可以监听到全局的动作了)

from django.db.models.signals import post_save
def get_model_create_logger(sender, **kwargs):
# 这里的函数名是随意起的,自定义
print(1,"post_save_callback") print(2,sender, 3,kwargs) """ sender:<class 'note.models.Author'>.我们的sender得出的是当前url里面的表名, kwargs:{'signal': <django.db.models.signals.ModelSignal object at 0x000000000321B8D0>, 'instance': <Author: Author object>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'} """ # print(sender, kwargs.get("instance")) import logging logging.warning("%s创建了一个%s的实例对象"%(sender._meta.model_name,kwargs.get("instance"))) post_save.connect(get_model_create_logger) """ 我们的post_save是信号里面的参数,不同的参数所监听的方法是不一样的,具体的参数以及所对应的监听方法都是在我们的源码里面封装好的, 点进去就能看到类下面的属性和方法,根据不同的需求自行更改, """

我们的信号核心代码就是init里面的这个,

信号参数如下:

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

 

url路由:

  url(r'^add/book', views.add_book),
    url(r'^add/author', views.add_author),

 

view视图:

from .models import *
import logging

# 这里是信号测试,我们要监听model表数据的变化,需要使用信号来监听所有的数据表,那么就需要在程序一开始加载的时候就进行监听,
# 要在程序运行起来之前就监听,这个时候就只有我们的项目根目录下面的init文件,我们的程序一开始加载的时候就会加载这个文件夹里面的内容,
# 就像我们在pycharm里面用mysql一样,会需要在这个init里面配置好pymysql的文件引入一样.如下:
# import pymysql
# pymysql.install_as_MySQLdb()
def add_book(request):
    Book.objects.create(name="java")
    return HttpResponse("java")


def add_author(request):
    Author.objects.create(name="egon")
    return HttpResponse("egon")

 

model表数据:

from django.db import models


# Create your models here.
class Book(models.Model):
    name = models.CharField(max_length=32)


class Author(models.Model):
    name = models.CharField(max_length=32)

 

posted @ 2018-04-01 23:10  dream-子皿  阅读(106)  评论(0)    收藏  举报