Это было добавлено к документации , когда была выпущена Django 1.7 :
Строго говоря, код обработки и регистрации сигналов может жить где угодно, хотя рекомендуется избегать корневого модуля приложения и модуля его моделей, чтобы минимизировать побочные эффекты импорта кода.
На практике обработчики сигналов обычно определяются в подмодуле сигналов приложения, к которому они относятся. Приемники сигналов подключаются в метод ready () класса конфигурации вашего приложения. Если вы используете декоратор receive (), просто импортируйте субмодуль сигналов внутри ready ().
Изменено в Django 1.7: Так как ready () не существовало в предыдущих версиях Django, регистрация сигналов обычно происходила в модуле моделей.
Рекомендуется определять ваши обработчики в handlers.py в подмодуле сигналов, например, файл, который выглядит как:
YourApp / сигналы / 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 #noqa
Убедитесь, что вы загружаете свой AppConfig, указав его либо непосредственно в INSTALLED_APPS вашего settings.py, либо в __init__
вашего приложения. См. см. Документацию ready () для получения дополнительной информации.
Примечание: Если вы предоставляете сигналы для других приложений, которые тоже могут прослушивать, поместите их в __init__
в вашем модуле сигналов, например, файл, который выглядит как:
* * YourApp тысячи сорок один / сигналы / __ __ INIT. Р * ** 1043 тысяча сорок-дв *
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. Ру
import signals
Это не так хорошо, как использование метода ready (), потому что это часто вызывает проблемы кругового импорта.