Django之信号

信号

    框架帮助开发者预留的可扩展的位置

    如果要对某张表操作增删啊之前之后都要记录可以使用信号,当然也可以使用触发器

使用:

在项目init文件下:

 1 from django.db.models import signals
 2 
 3 
 4 def before_save(*args, **kwargs):
 5     print(args, kwargs)
 6 
 7 
 8 def after_save(*args, **kwargs):
 9     print(args, kwargs)
10 
11 
12 signals.pre_save.connect(before_save)
13 signals.post_save.connect(after_save)

url.py

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('login/', views.login),
]

models.py

1 from django.db import models
2 
3 
4 class UserType(models.Model):
5     title = models.CharField(max_length=32)

views.py

 1 from django.shortcuts import render, HttpResponse
 2 from app01 import models
 3 
 4 
 5 def index(request):
 6     # models.UserType.objects.create(title='普通杂碎')
 7     return HttpResponse('ok')
 8 
 9 
10 def login(request):
11     models.UserType.objects.create(title='挑逗杂碎')
12     return HttpResponse('ok')

 Django内置信号

 1 Model signals
 2     pre_init                    # django的modal执行其构造方法前,自动触发
 3     post_init                   # django的modal执行其构造方法后,自动触发
 4     pre_save                    # django的modal对象保存前,自动触发
 5     post_save                   # django的modal对象保存后,自动触发
 6     pre_delete                  # django的modal对象删除前,自动触发
 7     post_delete                 # django的modal对象删除后,自动触发
 8     m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
 9     class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
10 Management signals
11     pre_migrate                 # 执行migrate命令前,自动触发
12     post_migrate                # 执行migrate命令后,自动触发
13 Request/response signals
14     request_started             # 请求到来前,自动触发
15     request_finished            # 请求结束后,自动触发
16     got_request_exception       # 请求异常后,自动触发
17 Test signals
18     setting_changed             # 使用test测试修改配置文件时,自动触发
19     template_rendered           # 使用test测试渲染模板时,自动触发
20 Database Wrappers
21     connection_created          # 创建数据库连接时,自动触发

自定义信号:

定义信号:

1 import django.dispatch
2 pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

注册信号:

1 pizza_done.connect(函数名)

触发:

1 pizza_done.send()

更多:https://docs.djangoproject.com/en/dev/topics/signals/

原文地址:https://www.cnblogs.com/Alexephor/p/11323287.html