Djangoのシグナル

信号

Djangoは操作がフレームを分離するために行われ、「信号のスケジューリング」を提供します。人気の用語は、それはいくつかのアクションが発生した時には、信号が特定の送信者が受信者の一部を思い出させることが可能です。

Djangoは内蔵の信号

Model signals
    pre_init                    # django的model执行其构造方法前,自动触发
    post_init                   # django的model执行其构造方法后,自动触发
    pre_save                    # django的model对象保存前,自动触发,新增或者更新都是保存
    post_save                   # django的model对象保存后,自动触发
    pre_delete                  # django的model对象删除前,自动触发
    post_delete                 # django的model对象删除后,自动触发
    m2m_changed                 # django的model中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
    pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发
Request/response signals
    request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发
Test signals
    setting_changed             # 使用test测试修改配置文件时,自动触发
    template_rendered           # 使用test测试渲染模板时,自动触发
Database Wrappers
    connection_created          # 创建数据库连接时,自动触发

それぞれの反対が輸入します:

from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception

from django.db.models.signals import class_prepared
from django.db.models.signals import pre_init, post_init
from django.db.models.signals import pre_save, post_save
from django.db.models.signals import pre_delete, post_delete
from django.db.models.signals import m2m_changed
from django.db.models.signals import pre_migrate, post_migrate

from django.test.signals import setting_changed
from django.test.signals import template_rendered

from django.db.backends.signals import connection_created

プログラムが自動的に呼び出さ登録機能を実行したときに、Djangoの内蔵の信号の場合、信号のみレジスタは、指定されました。

信号をサインアップし、ファイルは下のプロジェクトフォルダと同じ名前の書かれ__init__.pyたファイル(またはアプリケーションのフォルダ__init__.pyのファイルまたはviews.pyビュー)、変更は、ローカルのデータベースエンジンです。

次の2つの方法で信号に受信機を接続することができます。

from django.core.signals import request_finished

request_finished.connect(my_callback)

# my_callback是一个定义的函数
# 参数必须是 sender,**kwargs 是必须的
def my_callback(sender, **kwargs):
    print("Request finished!")

また、あなたが使用することができreceiver()デコレータを:

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

特定の送信者によって送信された信号に接続

あなただけの特定のたいときmodel時のクラスの操作信号をトリガする、ここであなたが使用できるreceiverの機能sender特定のを指すmodelクラスを。

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):
    print('Save finished')

このmy_handler機能はのみされるMyModel上に保存されたときに呼び出さインスタンスMyModel他の操作は、この機能をトリガしません。

繰り返し信号の防止

いくつかのケースでは、受信機は、コード信号に接続されて複数回実行されてもよいです。これは、単一の信号イベントが複数回呼び出されるのでために、あなたの受信機の機能が複数回登録されている可能性があります。

(例えば、あなたがモデルを保存するときに信号を送信するために電子メールを使用するなど)、この行動上の問題は、として一意の識別子を渡すとdispatch_uid受信者機能を識別するためのパラメータ。この識別子は、任意の十分にハッシュ・オブジェクトが、典型的には文字列です。最終結果は、それぞれ独自のために、ということであるdispatch_uid値、あなたの受信機の機能が一つの信号にのみ結合します。

from django.core.signals import request_finished

request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")

カスタム信号

定義された信号

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
#toppings和size这两个参数名称是随意取的,不是固定的,但是使用的时候关键字传参的时候,要和这两个参数的名称对应好,可以通过设置参数来进行一个判断处理等操作

信号を送信します

def callback(sender, **kwargs):
    print("callback")

pizza_done.connect(callback)

おすすめ

転載: www.cnblogs.com/zhufanyu/p/12149092.html