zoukankan      html  css  js  c++  java
  • django的信号机制

    django的信号机制

    django提供的信号机制可以在框架触发特定的条件发生前后执行提前定义好的函数

    常见的内置的信号有

    • 模型信号

      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字段操作数据库的第三张表
      
    • 请求、响应的信号

      request_started                 # 请求到来前,自动触发
      request_finished                # 请求结束后,自动触发
      got_request_exception           # 请求异常时,自动触发
      
    • 数据库迁移信号

      pre_migrate                     # 执行migrate命令前,自动触发
      post_migrate                    # 执行migrate命令后,自动触发 
      

    更多信号可以参考官方文档

    信号的使用

    from django.db.models import signals
    from django.dispatch import receiver
    
    @receiver(signals.post_save)
    def signals_callback(sender, **kwargs):
        print(sender)
        print(kwargs)
    

    使用django的receiver装饰器,装饰器接受一个信号类别的函数对象
    sender为装饰器接受的对应信号类别对象所指定的类型
    只要在项目加载过程中能够加载到这个信号所在的文件就可以完成信号的注册
    一般放在特定app的__init__文件夹下

    自定义信号

    创建信号

    from django.db.models import signals
    from django.core.signals import request_started
    from django.dispatch import receiver, Signal
    
    
    # @receiver(signals.post_save)
    # def signals_callback(sender, **kwargs):
    #     print(sender)
    #     print(kwargs)
    
    
    send_email_signal = Signal(providing_args=['username', 'email', 'message'])
    
    
    @receiver(send_email_signal)
    def send_email(sender, username, email, message, **kwargs):
        print(sender)
        print(username)
        print(email)
        print(message)
    

    调用信号

    from django.http import HttpResponse
    
    from . import models
    from . import send_email_signal
    
    
    # Create your views here.
    
    
    def index(request):
        send_email_signal.send(sender="sender", username="ivy", email="email", message="message")
        return HttpResponse("ok")
    
  • 相关阅读:
    win10自带邮箱应用无法查看qq邮箱应用解决办法
    Ubuntu紫色背景颜色代码
    VMware中对Linux虚拟机的网络配置静态IP的配置
    CentOS 7在VMware 12中共享文件看不见的问题?
    C++中让人忽视的左值和右值
    C++ allocator类学习理解
    C++11新特性 -----> 右值引用 &&
    重新认识new
    关于C++中nothrow的某某某
    stopPropagation, preventDefault 和 return false 的区别
  • 原文地址:https://www.cnblogs.com/ivy-blogs/p/12634654.html
Copyright © 2011-2022 走看看