將其加入到documentation當Django的1.7發佈:
嚴格地說,信號處理和註冊碼可以住在任何地方你喜歡,雖然它的建議,以避免應用程序的根模塊和模型模塊以最小化導入代碼的副作用。
實際上,信號處理程序通常是在它們相關的應用程序的信號子模塊中定義的。信號接收器連接在應用程序配置類的ready()方法中。如果您使用的是receiver()裝飾器,只需在ready()中導入信號子模塊。
在Django 1.7中更改:由於ready()在先前版本的Django中不存在,因此信號註冊通常發生在models模塊中。
最佳做法是在信號子模塊的handlers.py中定義處理程序,例如,
yourapp /信號/ 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中,使用,看起來像一個文件準備好()方法。這將是這樣的:
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
確保您直接在您的settings.py的INSTALLED_APPS指定,要麼加載你的AppConfig,或在__init__
的你的應用。有關更多信息,請參閱see the ready() documentation。
注意:如果您也爲其他應用程序也提供了信號以偵聽,請將它們放入信號模塊中的__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 /信號/ handlers.py定義處理程序),而是比使用AppConfig,你會通過你的應用的__init__.py加載處理程序,例如是這樣的:
yourapp/__ init__.py
import signals
這並不像你一樣使用就緒()方法,因爲它往往會造成圓形的進口問題。
導入模型我喜歡這一點。謝謝! – 2010-04-27 14:12:57
你通常在哪裏連接處理程序的信號? – DataGreed 2010-12-28 17:42:54
@DataGreed:位於相關models.py的底部。 – 2010-12-28 19:05:10