이것은 Django 1.7 이 릴리스 되었을 때 문서 에 추가 되었습니다.
엄밀히 말하면 신호 처리 및 등록 코드는 원하는 곳 어디에서나 살 수 있지만 코드 가져 오기의 부작용을 최소화하기 위해 응용 프로그램의 루트 모듈과 모델 모듈을 피하는 것이 좋습니다.
실제로, 신호 처리기는 일반적으로 관련 응용 프로그램의 신호 하위 모듈에 정의됩니다. 신호 수신기는 애플리케이션 구성 클래스의 ready () 메소드로 연결됩니다. receiver () 데코레이터를 사용한다면, ready () 안에 신호 서브 모듈을 가져 오기만하면됩니다.
Django 1.7에서 변경 : ready ()가 이전 버전의 Django에 존재하지 않았기 때문에 신호 등록은 일반적으로 models 모듈에서 발생했습니다.
모범 사례는 handlers.py에서 신호 하위 모듈의 핸들러를 정의하는 것입니다 (예 : 다음과 같은 파일).
yourapp / signals / 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
신호 처리기를 등록하는 가장 좋은 장소는 ready () 메소드를 사용하여이를 정의하는 앱의 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 또는 __init__
앱 에서 직접 지정하여 AppConfig를로드하고 있는지 확인하십시오 . 자세한 내용은 ready () 설명서 를 참조하십시오.
참고 : 다른 앱에서도들을 수있는 신호를 제공하는 경우 __init__
신호 모듈에 신호를 넣으십시오 (예 : 다음과 같은 파일).
yourapp / signals / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
그런 다음 다른 앱에서 신호를 가져 와서 등록하여 신호를들을 수 있습니다 (예 :) from yourapp.signals import task_generate_pre_save
. 핸들러에서 신호를 분리하면 상태가 깨끗해집니다.
장고 1.6에 대한 지침 :
여전히 Django 1.6 또는 그 이하 버전에 머물러 있다면 AppConfig를 사용하는 대신 동일한 작업을 수행하지만 (app / signals / handlers.py에서 핸들러 정의) __init__.py of 앱과 같은 것 :
yourapp / __ init__.py
import signals
ready () 메소드를 사용하는 것만 큼 좋지는 않습니다. 종종 순환 가져 오기 문제가 발생하기 때문입니다.