信号处理程序应该住在Django项目中的哪里?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

我刚刚开始在Django项目中实现信号侦听器。而我知道它们是什么以及如何使用它们。我很难弄清楚我应该把它们放在哪里。Django网站的文件中有这样的内容:

你可以把信号处理和注册代码放在任何你喜欢的地方。但是,您需要确保它所在的模块在早期导入,以便在需要发送任何信号之前注册信号处理。这使您的应用程序的模型.py是一个很好的地方来注册信号处理程序。

虽然这是个很好的建议,但在模型中使用非模型类或方法,这会让我感到不快。

那么,存储和注册信号处理程序的最佳实践/规则是什么?

提问于
用户回答回答于

实际上,我喜欢让它们成为模型本身的类方法。这使得所有东西都保存在一个类中,这意味着不必担心导入任何东西。

用户回答回答于

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel

@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
    pass

然后,注册信号处理程序的最佳位置是在定义它的应用程序的AppConfig中,使用准备()方法。这个看起来是这样的:

你喜欢/应用程序:

from django.apps import AppConfig

class TasksConfig(AppConfig):
    name = 'tasks'
    verbose_name = "Tasks"

    def ready(self):
        import yourproject.yourapp.signals.handlers #noqa

通过直接在setings.py安装中指定AppConfig,确保加载了AppConfig_应用程序,或在__init__你的应用程序。

注:如果也为其他应用程序提供了信号,请将它们放到__init__在你的信号模块中,例如一个文件,看起来像:

import django.dispatch

task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])

另一个应用程序可以通过导入和注册你的信号。from yourapp.signals import task_generate_pre_save...。将信号与处理程序分离,使事情保持干净。

给Django 1.6的说明:

如果仍然停留在Django 1.6或更低版本上,那么将执行相同的操作(在yourapp/signs/handlers.py中定义处理程序),但不是使用AppConfig,而是通过__依尼特__.py的应用程序,例如:

import signals

这不如使用ready()方法好,因为它经常导致循环导入问题。

扫码关注云+社区