Điều này đã được thêm vào tài liệu khi Django 1.7 được phát hành:
Nói một cách chính xác, xử lý tín hiệu và mã đăng ký có thể sống ở bất cứ đâu bạn muốn, mặc dù vậy, nên tránh mô-đun gốc của ứng dụng và mô-đun mô hình của ứng dụng để giảm thiểu tác dụng phụ của việc nhập mã.
Trong thực tế, các bộ xử lý tín hiệu thường được xác định trong một mô hình con tín hiệu của ứng dụng mà chúng liên quan đến. Bộ thu tín hiệu được kết nối theo phương thức ready () của lớp cấu hình ứng dụng của bạn. Nếu bạn đang sử dụng trình trang trí máy thu (), chỉ cần nhập mô hình con tín hiệu bên trong sẵn sàng ().
Thay đổi trong Django 1.7: Vì sẵn sàng () không tồn tại trong các phiên bản trước của Django, đăng ký tín hiệu thường xảy ra trong mô-đun mô hình.
Thực hành tốt nhất là xác định trình xử lý của bạn trong handlers.py trong một mô hình con tín hiệu, ví dụ: một tệp trông giống như:
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
Nơi tốt nhất để đăng ký trình xử lý tín hiệu của bạn là trong AppConfig của ứng dụng xác định nó, sử dụng phương thức ready () . Điều này sẽ trông như thế này:
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
Đảm bảo bạn đang tải AppConfig của mình bằng cách chỉ định trực tiếp trong INSTALLED_APPS của cài đặt của bạn hoặc trong __init__
ứng dụng của bạn. Xem xem tài liệu sẵn sàng () để biết thêm thông tin.
Lưu ý: Nếu bạn cũng đang cung cấp tín hiệu cho các ứng dụng khác nghe, hãy đặt chúng vào __init__
mô-đun tín hiệu của bạn, ví dụ: một tệp trông giống như:
yourapp / signal / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
Một ứng dụng khác sau đó có thể nghe tín hiệu của bạn bằng cách nhập và đăng ký nó, ví dụ from yourapp.signals import task_generate_pre_save
. Tách các tín hiệu của bạn từ xử lý của bạn giữ cho mọi thứ sạch sẽ.
Hướng dẫn cho Django 1.6:
Nếu bạn vẫn bị kẹt trên Django 1.6 trở xuống, thì bạn cũng sẽ làm điều tương tự (xác định trình xử lý của bạn trong yourapp / signal / handlers.py) nhưng thay vì sử dụng AppConfig, bạn sẽ tải trình xử lý qua __init__.py của ứng dụng của bạn, ví dụ như một cái gì đó như:
yourapp / __ init__.py
import signals
Điều này không tốt bằng sử dụng phương thức ready () vì nó thường gây ra các vấn đề nhập vòng tròn.