Django: using signals

signal

  • Django provides a "signal scheduling", an operation is performed for decoupling frame. Popular terms, it is time some action occurs, signals allow specific senders to remind some of the recipients.
  • Application: for example, inserting data into the database, to write the log before inserting, write the log after insertion.
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          # 创建数据库连接时,自动触发

1. Use a signal:

  • For Django built-in signal, only registered designation signal, when the program perform actions automatically trigger registration function, registration signals, files are written with the same name as the project folder under the __init__.pyfile , but also for the local database engine. Take an example here post_save

    • __init__.py
    # post_save:django的model对象保存后,自动触发
    from django.db.models.signals import post_save
    def callback(sender,**kwargs):
        print("执行post_save信号")
        print(sender,kwargs)
    
    post_save.connect(callback)#信号连接,并调用回调函数
    • views.py
    def student_list(request):
        students = models.Student.objects.all()
        print(students)
        models.Student.objects.create(name='xxoo')#创建一个对象,用于触发信号
        return render(request,'stu.html',{"students":students})

2. Signal Usage II:

  • By decorators receiver, a plurality of signals may be added
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save)# django的model对象保存后,自动触发
def callback(sender,**kwargs):
    print("执行post_save信号")
    print(sender,kwargs)

post_save.connect(callback)

@receiver(pre_save)# django的model对象保存前,自动触发
def callback2(sender,**kwargs):
    print("执行pre_save信号")
    print(sender,kwargs)

pre_save.connect(callback2)

3. Custom signal:

  • In a py file definition signal! sig.py
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])#toppings,size自己定义字段
  • In __init__.pythe registration signal
from sig import pizza_done
def callback(sender, **kwargs):
    print("callback")
    print(sender, kwargs)


pizza_done.connect(callback)

#触发后打印结果:
callback

seven {'signal': <django.dispatch.dispatcher.Signal object at 0x000001BCD6D82B38>, 'toppings': 123, 'size': 456}
  • In view of the function of the trigger signal because the signal has been triggered by the built-in integrated into Django, so it will automatically call, and for custom developers trigger signal is required in any position

    from django.shortcuts import render
    from app01 import models
    
    from sig import pizza_done
    
    def student_list(request):
      students = models.Student.objects.all()
      pizza_done.send(sender='seven', toppings=123, size=456)#给sig中定义的字段传值,发起信号者赋值
      return render(request,'stu.html',{"students":students})
触发信号:单独写文件,如果在视图函数写函数,当代码取消,不方便。如果单独写函数,虽然添加信号会繁琐,但功能不需要取消时候,就方便许多。

Guess you like

Origin www.cnblogs.com/xujunkai/p/11848668.html