Dies wurde der Dokumentation hinzugefügt, als Django 1.7 veröffentlicht wurde:
Genau genommen können Signalverarbeitungs- und Registrierungscode überall verwendet werden. Es wird jedoch empfohlen, das Root-Modul der Anwendung und das Modellmodul zu vermeiden, um die Nebenwirkungen des Codeimports zu minimieren.
In der Praxis werden Signalhandler normalerweise in einem Signal-Submodul der Anwendung definiert, auf die sie sich beziehen. Signalempfänger werden in der ready () -Methode Ihrer Anwendungskonfigurationsklasse verbunden. Wenn Sie den Receiver () -Dekorator verwenden, importieren Sie einfach das Signal-Submodul in ready ().
In Django 1.7 geändert: Da ready () in früheren Versionen von Django nicht vorhanden war, erfolgte die Signalregistrierung normalerweise im Modellmodul.
Die beste Vorgehensweise besteht darin, Ihre Handler in handlers.py in einem Signal-Submodul zu definieren, z. B. in einer Datei, die wie folgt aussieht:
yourapp / signales / 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
Der beste Ort, um Ihren Signalhandler zu registrieren, ist dann in der AppConfig der App, die ihn definiert, mithilfe der ready () -Methode. Das wird so aussehen:
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
Stellen Sie sicher, dass Sie Ihre AppConfig laden, indem Sie sie entweder direkt in INSTALLED_APPS von settings.py oder in __init__
Ihrer App angeben . Siehe die bereit () Dokumentation für weitere Informationen.
Hinweis: Wenn Sie Signale bereitstellen, die auch von anderen Apps abgehört werden sollen, fügen Sie diese in das __init__
Signalmodul ein, z. B. eine Datei, die wie folgt aussieht:
Ihre App / Signale / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Eine andere App kann dann Ihr Signal abhören, indem Sie es importieren und registrieren, z from yourapp.signals import task_generate_pre_save
. Wenn Sie Ihre Signale von Ihren Handlern trennen, bleiben die Dinge sauber.
Anleitung für Django 1.6:
Wenn Sie immer noch mit Django 1.6 oder niedriger arbeiten, tun Sie dasselbe (definieren Sie Ihre Handler in yourapp / signales / handlers.py), aber anstatt AppConfig zu verwenden, laden Sie die Handler über __init__.py von Ihre App, zB so etwas wie:
yourapp / __ init__.py
import signals
Dies ist nicht so schön wie die Verwendung der ready () -Methode, da dies häufig zu Problemen beim zirkulären Import führt.