Це було додано до документації, коли було випущено Django 1.7 :
Строго кажучи, обробка сигналів та код реєстрації можуть жити де завгодно, хоча рекомендується уникати кореневого модуля програми та модуля його моделей, щоб мінімізувати побічні ефекти імпорту коду.
На практиці обробники сигналів зазвичай визначаються в підмодулі сигналів програми, до якої вони відносяться. Приймачі сигналів підключаються за готовим () методом вашого класу конфігурації програми. Якщо ви використовуєте декоратор приймача (), просто імпортуйте підмодуль сигналів всередині готового ().
Змінено в 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 #noqa
Переконайтеся, що ви завантажуєте свій AppConfig, вказавши його безпосередньо в INSTALLED_APPS свого settings.py або в __init__
додатку. Для отримання додаткової інформації див. Готову () документацію .
Примітка. Якщо ви надаєте сигнали і для інших додатків для прослуховування, __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 (), оскільки це часто викликає кругові проблеми з імпортом.