Это было добавлено в документацию при выпуске Django 1.7 :
Строго говоря, код обработки сигналов и регистрации может находиться где угодно, хотя рекомендуется избегать корневого модуля приложения и его модуля моделей, чтобы минимизировать побочные эффекты импорта кода.
На практике обработчики сигналов обычно определяются в подмодуле сигналов приложения, к которому они относятся. Приемники сигналов подключаются в методе ready () класса конфигурации вашего приложения. Если вы используете декоратор Receiver (), просто импортируйте подмодуль сигналов внутри ready ().
Изменено в Django 1.7: поскольку ready () не существовало в предыдущих версиях Django, регистрация сигналов обычно происходила в модуле моделей.
Лучше всего определять обработчики в handlers.py в подмодуле сигналов, например, в файле, который выглядит так:
yourapp / signal / 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 () . Это будет выглядеть так:
yourapp / apps.py :
from django.apps import AppConfig
class TasksConfig(AppConfig):
name = 'tasks'
verbose_name = "Tasks"
def ready(self):
import yourproject.yourapp.signals.handlers
Убедитесь, что вы загружаете свой AppConfig, указав его либо непосредственно в INSTALLED_APPS вашего settings.py, либо в __init__
вашем приложении. См . Дополнительную информацию в документации по ready () .
Примечание. Если вы предоставляете сигналы другим приложениям, чтобы они тоже слушали, поместите их в __init__
модуль сигналов, например, в файл, который выглядит так:
yourapp / сигналы / __ init__.py
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 / signal / handlers.py), но вместо использования AppConfig вы загрузили бы обработчики через __init__.py из ваше приложение, например, что-то вроде:
yourapp / __ init__.py
import signals
Это не так хорошо, как использование метода ready (), потому что он часто вызывает проблемы с циклическим импортом.