美文网首页
Django 信号

Django 信号

作者: Diaoaha | 来源:发表于2018-11-02 19:52 被阅读0次

    Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

    Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。

    一些内置信号
    django.db.models.signals.pre_save 在某个Model保存之前调用
    django.db.models.signals.post_save 在某个Model保存之后调用
    django.db.models.signals.pre_delete 在某个Model删除之前调用
    django.db.models.signals.post_delete 在某个Model删除之后调用
    django.core.signals.request_started 在建立Http请求时发送
    django.core.signals.request_finished 在关闭Http请求时发送
    

    我们要做的,就是注册一个receiver函数。例如,如果要在每次请求完成之后,打印一行字。

    from django.core.signals import request_finished
    from django.dispatch import receiver
      
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print("Request finished!")
    

    post_save()是一个比较实用函数,可以支持一些联动的更新。而不必让我们每次都写在view里面。比如:有用户提交了退款申请,我们需要把订单的状态修改成“已退款”的状态。就可以使用信号机制,而不必在每处都修改。

    @receiver(post_save, sender=RefundForm)
    def order_state_update(sender, instance, created, **kwargs):
      instance.order.state = REFUNDING
      instance.order.save() # 这里,order是refundform的一个外键
    

    sender定义了信号的来源,装饰器相当于将这个函数猪车到这个信号上,我们还可以通过sender来过滤信号来源。

    相关文章

      网友评论

          本文标题:Django 信号

          本文链接:https://www.haomeiwen.com/subject/nuzcxqtx.html