Bu, Django 1.7 piyasaya çıktığında belgelere eklendi :
Kesin olarak, sinyal işleme ve kayıt kodu istediğiniz yerde yaşayabilir, ancak kodun içe aktarılmasının yan etkilerini en aza indirmek için uygulamanın kök modülünden ve model modülünden kaçınmanız önerilir.
Pratikte, sinyal işleyiciler genellikle ilişkili oldukları uygulamanın bir sinyal alt modülünde tanımlanır. Sinyal alıcıları, uygulama yapılandırma sınıfınızın ready () yöntemine bağlanır. Receiver () dekoratörünü kullanıyorsanız, ready () içindeki sinyaller alt modülünü içe aktarmanız yeterlidir.
Django 1.7'de değiştirildi: Django'nun önceki sürümlerinde ready () bulunmadığından, sinyal kaydı genellikle modeller modülünde gerçekleşti.
En iyi uygulama, işleyicilerinizi handlers.py dosyasında sinyaller alt modülünde, örneğin şuna benzer bir dosya olarak tanımlamaktır:
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
Sinyal işleyicinizi kaydetmek için en iyi yer, hazır () kullanarak uygulamayı tanımlayan uygulamanın AppConfig dosyasındadır. yöntemini . Bu şöyle görünecektir:
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
Doğrudan ayarlarınızda veya __init__
uygulamanızda INSTALLED_APPS ayarında belirterek AppConfig'nizi yüklediğinizden emin olun . Daha fazla bilgi için hazır () belgelerine bakın.
Not: Diğer uygulamaların da dinlemesi için sinyal sağlıyorsanız, bunları __init__
sinyal modülünüze, örneğin aşağıdaki gibi bir dosyaya yerleştirin:
YourApp / sinyaller / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Daha sonra başka bir uygulama sinyalinizi içe aktararak ve kaydederek dinleyebilir, örn from yourapp.signals import task_generate_pre_save
. Sinyallerinizi işleyicilerinizden ayırmak işleri temiz tutar.
Django 1.6 için talimatlar:
Hala Django 1.6 veya daha düşük bir sürümde kalıyorsanız, aynı şeyi yaparsınız (işleyicilerinizi yourapp / signal / handlers.py'de tanımlayın), ancak AppConfig kullanmak yerine, işleyicileri __init__.py üzerinden yüklersiniz. uygulamanız, örneğin:
YourApp / __ init__.py
import signals
Bu, genellikle dairesel içe aktarma sorunlarına neden olduğu için ready () yöntemini kullanmak kadar hoş değildir.