zoukankan      html  css  js  c++  java
  • Django 信号使用问题

    Django 信号使用问题:

    在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发。百度&官方文档找到了答案

    1.信号的函数应该放在哪里?

    这段代码应该放在哪里?

    严格来说,信号处理和注册的代码应该放在你想要的任何地方,但是推荐避免放在应用的根模块和models模块中,以尽量减少产生导入代码的副作用。

    实际上,信号处理函数通常定义在应用相关的signals子模块中。 信号receiver在你应用配置类中的ready()方法中连接。 如果你使用receiver()装饰器,只需要在ready()内部导入signals子模块就可以。

    ready()方法会在测试期间执行多次,所以你可能想要保证信号不会重复,尤其是打算在测试中发送它们的情况。

    2.为什么没有触发?

    信号触发主要需要三个条件:

    1.信号能正常工作

    2.在app的config中触发信号

    3.在settings中使用自定义的AppConfig

    • 编写signals

      代码如下signals.py,django对于信号推荐位置的是:app所在目录下新建名为signals.py的文件

    from django.db.models.signals import post_delete
    from django.dispatch import receiver
    from device.models import Device  # replace with your Model 
    
    @receiver(post_delete, sender=Device, weak=False)
    def delete_comment_after(sender):
        print('device delete')
        print(sender)
    
    • 编写 AppConfig,位于 app下 apps.py,代码如下:
    from django.apps import AppConfig
    
    class DeviceConfig(AppConfig):
        name = 'device'
        verbose_name = '设备'
    
    def ready(self):
        import device.signals
    
    • 在settings.py中修改INSTALL_APPS代码如下:

      INSTALLED_APPS = [
          ...
          'device' ---> 'device.apps.DeviceConfig'
              'device.apps.DeviceConfig', 
          默认情况下我们通常叫做device,但是因为信号需要在自定义的AppConfig中触发,因此必须把
          device修改为 device.apps.DeviceConfig,这样才能触发信号
               ...
      ]
      
      
  • 相关阅读:
    搭建公共DNS服务器[转]
    zabbix3.4 yum快速安装
    centos7安装图形化界面并远程连接
    记一次排查黑客入侵
    centos6安装图形界面并远程连接
    树莓派做NAS
    document.documentElement.scrollTop||document.body.scrollTop;
    矩阵连乘
    母函数详解
    Catalan 数
  • 原文地址:https://www.cnblogs.com/wenqiangit/p/10905926.html
Copyright © 2011-2022 走看看