Questo è stato aggiunto alla documentazione quando è stato rilasciato Django 1.7 :
A rigor di termini, la gestione del segnale e il codice di registrazione possono vivere ovunque tu voglia, anche se si consiglia di evitare il modulo radice dell'applicazione e il suo modulo modelli per ridurre al minimo gli effetti collaterali dell'importazione del codice.
In pratica, i gestori di segnali sono generalmente definiti in un sottomodulo di segnali dell'applicazione a cui si riferiscono. I ricevitori di segnali sono collegati nel metodo ready () della classe di configurazione dell'applicazione. Se stai usando il decoratore ricevitore (), importa semplicemente il sottomodulo dei segnali all'interno di ready ().
Modificato in Django 1.7: poiché ready () non esisteva nelle versioni precedenti di Django, la registrazione del segnale di solito avveniva nel modulo modelli.
La migliore pratica è definire i gestori in handlers.py in un sottomodulo di segnali, ad esempio un file che assomigli a:
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
Il posto migliore per registrare il gestore del segnale è quindi nell'AppConfig dell'app che lo definisce, usando il metodo ready () . Questo sarà simile al seguente:
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
Assicurati di caricare AppConfig specificandolo direttamente nelle tue settings.pY INSTALLED_APPS o nel __init__
tua app. Vedere la documentazione ready () per ulteriori informazioni.
Nota: se stai fornendo segnali anche per altre app da ascoltare, inseriscili nel __init__
modulo dei segnali, ad esempio un file che assomigli a:
YourApp / segnali / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Un'altra app può quindi ascoltare il tuo segnale importandolo e registrandolo, ad es from yourapp.signals import task_generate_pre_save
. Separare i segnali dai gestori mantiene le cose pulite.
Istruzioni per Django 1.6:
Se sei ancora bloccato su Django 1.6 o precedente, allora faresti la stessa cosa (definisci i tuoi gestori in yourapp / signal / handlers.py) ma invece di usare AppConfig, caricheresti i gestori tramite __init__.py di la tua app, ad esempio qualcosa del tipo:
YourApp / __ init__.py
import signals
Questo non è bello come usare il metodo ready () perché spesso causa problemi di importazione circolare.