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")
    
  • 相关阅读:
    XSS漏洞学习笔记
    【react】使用 create-react-app 构建基于TypeScript的React前端架构
    React-使用装饰器
    探究Hybrid-APP技术原理
    getBoundingClientRect使用指南
    React.js + LiveReload配置详解
    《高性能JavaScript》学习笔记(2)——日更中
    JavaScript设计模式学习之路——继承
    JavaScript数组去重的四种方法
    《高性能JavaScript》学习笔记——日更中
  • 原文地址:https://www.cnblogs.com/ivy-blogs/p/12634654.html
Copyright © 2011-2022 走看看