Django信号

文章目录

            • 1. Django信号使用场景
            • 2. Django内置信号
            • 3. Django信号简单示例

1. Django信号使用场景

对Django数据库中的某张表做增加、删除、修改之前记录一条日志可以使用Django中的信号,Django中的信号是 Django框架内部帮助开发者预留的可自定义扩展的位置。Flask和Scrapy框架也有信号。

2. 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          # 创建数据库连接时,自动触发
3. Django信号简单示例

models.py:

from django.db import models

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

urls.py:

from django.urls import path
from app import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('func1/', views.func1),
    path('func2/', views.func2),
    path('func3/', views.func3),
    path('func4/', views.func4),
]

views.py:

from django.shortcuts import render, HttpResponse
from app.models import User

# Create your views here.
def func1(request):
    """
    不会触发保存数据之前的操作(没有保存数据操作)
    :param request:
    :return:
    """
    return HttpResponse('创建成功!')

def func2(request):
    """
    会触发保存数据之前的操作
    :param request:
    :return:
    """
    User.objects.create(name='liki')
    return HttpResponse('创建成功!')

def func3(request):
    User.objects.create(name='thanlon')
    return HttpResponse('创建成功!')

def func4(request):
    User.objects.create(name='kiku')
    return HttpResponse('创建成功!')

__init__.py:

from django.db.models import signals


def before_save(*args, **kwargs):
    """
    增加之前
    :param args:
    :param kwargs:
    :return:
    """
    print(args)  # ()
    print(kwargs)


"""
{
    'signal': ,
    'sender': ,
    'instance': ,
    'raw': False,
    'using': 'default',
    'update_fields': None
}
"""


def after_save(*args, **kwargs):
    """
    增加之后
    :param args:
    :param kwargs:
    :return:
    """
    print(args)  # ()
    print(kwargs)
    """
    {
    'signal': , 
    'sender': , 
    'instance': , 
    'created': True, 
    'update_fields': None, 
    'raw': False, 
    'using': 'default'
    }
    """


signals.pre_save.connect(before_save)
signals.post_save.connect(after_save)
"""
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          # 创建数据库连接时,自动触发
"""

代码下载:https://github.com/ThanlonSmith/django_signel

你可能感兴趣的:(Django,django,Django信号,Django,signal,signal)