Zostało to dodane do dokumentacji po wydaniu Django 1.7 :
Ściśle mówiąc, obsługa sygnału i kod rejestracyjny mogą znajdować się w dowolnym miejscu, chociaż zaleca się unikanie modułu głównego aplikacji i jego modułu modeli, aby zminimalizować skutki uboczne importu kodu.
W praktyce programy obsługi sygnałów są zwykle definiowane w podmodule sygnałów aplikacji, do której się odnoszą. Odbiorniki sygnału są połączone w metodzie ready () klasy konfiguracyjnej Twojej aplikacji. Jeśli używasz dekoratora receiver (), po prostu zaimportuj podmoduł sygnałów do ready ().
Zmienione w Django 1.7: Ponieważ ready () nie istniał w poprzednich wersjach Django, rejestracja sygnału zwykle miała miejsce w module models.
Najlepszą praktyką jest zdefiniowanie swoich handlerów w handlers.py w module podrzędnym sygnałów, np. W pliku, który wygląda tak:
twojaaplikacja / sygnały / 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
Najlepszym miejscem do zarejestrowania modułu obsługi sygnału jest następnie w AppConfig aplikacji, która go definiuje, przy użyciu metody ready () . Będzie to wyglądać tak:
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
Upewnij się, że ładujesz swoją AppConfig, określając ją bezpośrednio w __init__
aplikacji INSTALLED_APPS settings.py lub w aplikacji. Zobacz dokumentację ready (), aby uzyskać więcej informacji.
Uwaga: jeśli zapewniasz sygnały, które mają nasłuchiwać również inne aplikacje, umieść je __init__
w swoim module sygnałów, np. Plik, który wygląda tak:
twojaaplikacja / sygnały / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Inna aplikacja może wtedy słuchać Twojego sygnału, importując go i rejestrując, np from yourapp.signals import task_generate_pre_save
. Oddzielenie sygnałów od obsługi pozwala zachować porządek.
Instrukcje dla Django 1.6:
Jeśli nadal utkniesz w Django 1.6 lub niższym, zrobiłbyś to samo (zdefiniowałbyś swoje programy obsługi w yourapp / signal / handlers.py), ale zamiast używać AppConfig, załadowałbyś moduły obsługi przez __init__.py Twoja aplikacja, np. coś takiego:
yourapp / __ init__.py
import signals
Nie jest to tak przyjemne jak użycie metody ready (), ponieważ często powoduje problemy z importowaniem cyklicznym.