gpt4 book ai didi

django - 信号处理程序应该放在 django 项目中的什么位置?

转载 作者:行者123 更新时间:2023-11-28 19:32:22 26 4
gpt4 key购买 nike

我刚刚开始在 Django 项目中实现信号监听器。虽然我了解它们是什么以及如何使用它们。我很难弄清楚我应该把它们放在哪里。 django 站点的文档是这样说的:

Where should this code live?

You can put signal handling and registration code anywhere you like. However, you'll need to make sure that the module it's in gets imported early on so that the signal handling gets registered before any signals need to be sent. This makes your app's models.py a good place to put registration of signal handlers.

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

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

最佳答案

这已添加到 documentationDjango 1.7 发布时:

Strictly speaking, signal handling and registration code can live anywhere you like, although it’s recommended to avoid the application’s root module and its models module to minimize side-effects of importing code.

In practice, signal handlers are usually defined in a signals submodule of the application they relate to. Signal receivers are connected in the ready() method of your application configuration class. If you’re using the receiver() decorator, simply import the signals submodule inside ready().

Changed in Django 1.7: Since ready() didn’t exist in previous versions of Django, signal registration usually happened in the models module.

最佳做法是在信号子模块的 handlers.py 中定义您的处理程序,例如一个看起来像这样的文件:

yourapp/signals/handlers.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 中,使用 ready() 方法。这看起来像这样:

你的app/apps.py:

from django.apps import AppConfig

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

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

通过直接在 settings.py 的 INSTALLED_APPS 或应用程序的 __init__ 中指定,确保您正在加载 AppConfig。参见 see the ready() documentation获取更多信息。

注意:如果您也为其他应用提供信号以供收听,请将它们放在信号模块的 __init__ 中,例如一个看起来像这样的文件:

yourapp/signals/_init_.py

import django.dispatch

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

然后,另一个应用程序可以通过导入和注册来收听您的信号,例如从 yourapp.signals 导入 task_generate_pre_save。将信号与处理程序分开可以保持清洁。

Django 1.6 说明:

如果您仍然停留在 Django 1.6 或更低版本上,那么您将做同样的事情(在您的应用程序/信号/处理程序中定义您的处理程序/信号处理程序。py)但不是使用 AppConfig,您将通过 _ 加载处理程序init_您应用的 .py,例如像这样的东西:

你的应用/_init_.py

import signals

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

关于django - 信号处理程序应该放在 django 项目中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com