大規模なDjangoプロジェクトは、多くの場合、複数のアプリ(ユーザー管理、注文、製品、eコマースシステムの支払い)で構成されています。各アプリは特定の機能に焦点を当てていますが、シームレスに対話する必要があります。信号はこの通信を促進し、アプリが緊密な結合なしで他のアプリのイベントに対応できるようにします。たとえば、
アプリが注文を確認すると、アプリはインベントリを更新できます。 Djangoの信号ディスパッチャーは仲介者として機能し、この分離されたコミュニケーションを可能にします。
products
orders
重要な概念:
信号の概要:
信号操作:
信号は、Pub-Subパターンと同様に動作します。信号送信者は出版社であり、受信者はサブスクライバーです。 受信者は、信号を受信するために登録(購読)しなければなりません
orders
products
送信者と受信者:
信号送信者は、信号を発するPythonオブジェクトです。受信機は、送信された信号に応じて実行されるPython関数またはメソッドです。登録されたレシーバーに関係なく、いくつかの信号(特に組み込みのもの)は送信されることに注意してください。
サンプルDjangoプロジェクトのセットアップ:
信号使用量を説明するために、サンプルeコマースプロジェクトを作成します。
mkdir my_shop
virtualenv
(pip install virtualenv
でインストール)を使用します。 環境を作成してアクティブにします(virtualenv venv
、OSに従ってアクティブ化します)。
pip install Django
インストール
django-admin startproject my_shop .
python manage.py startapp products
。 両方のアプリをpython manage.py startapp orders
INSTALLED_APPS
settings.py
モデルを定義します:Product
)。 移行を実行(products/models.py
およびOrder
)。orders/models.py
python manage.py makemigrations
python manage.py migrate
モジュールのインポート:
Signal
信号インスタンスの作成:receiver
(indjango.dispatch
):orders/signals.py
各アプリのorder_confirmed = Signal()
import orders.signals
アプリのビューでimport products.signals
の使用を確認して、注文確認後に信号を送信します。
ready()
apps.py
信号ハンドラー(受信者):order_confirmed.send(sender=order, ...)
ビルトインdjango信号:orders
@receiver(order_confirmed)
、products/signals.py
、order_confirmed
、および
ビルトイン信号の使用はカスタム信号に似ていますが、手動で送信する必要はありません。 たとえば、django.db.models.signals
モデルのdjango.core.signals
信号にレシーバーを接続するには。
pre_save
post_save
実用的な例:request_started
request_finished
post_save
を使用して、新しいユーザーが作成されたときにUser
プロファイルを自動的に作成します。
Customer
post_save
Comment
django信号は、アプリケーション内で分離された通信の強力なメカニズムを提供します。信号を理解して利用することにより、よりモジュール式、保守可能、スケーラブルなDjangoプロジェクトを作成できます。
以上がDjangoの信号の理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。