diadia

興味があることをやってみる。自分のメモを残しておきます。

django signal (set of built-in signals)について

set of built-in signalsとは

djangoが提供しているできあいのシグナルである。これを使うとシグナルを自身でカスタムする手間が省け、開発のスピードとコーディングの精度を担保できる。具体的にはpre_save,post_save,request_finished等が挙げられる。これらについて分かったことを記載する。

request_finishedと自作シグナルはどのような違いが有るか?

違いを理解するためにまず自作(カスタム)シグナルでconnect()を使う場面を考えてみる。connect()の使い方は以下から確認することができる。
https://docs.djangoproject.com/ja/2.1/topics/signals/#listening-to-signals

自作(カスタム)シグナルでconnect()を使うまでの手順

まずconnect()とはSignalのインスタンスメソッドである。だから以下のように使うことが想定される。

Signalインスタンス.connect(引数)

上記で必要なのはSignalインスタンスを準備すること、そしてconnect()の引数を準備することだ。

Signalインスタンスを準備する

以下のようにするとSignalのインスタンスを作成できる。

from django.dispatch import Signal
signal_instance = Signal(providing_args=["hoge","HoGe"])

これでシグナルインスタンスが作れる。詳しいことはこちらのドキュメントを読むと良い。
https://docs.djangoproject.com/ja/2.1/topics/signals/#defining-signals

connect()の引数を準備する

connect()の引数はレシーバ(receiver)関数だ。

Signalインスタンス.connect(レシーバ関数)

レシーバ関数はdjangoに存在するものではなく自分で定めるものだ。通常の関数を定義するようにdefを使ってレシーバを定めれば良い。ただレシーバ関数を定めるときの条件として特定の引数を定めることが条件としてある。それはsenderと**kwargsである。詳しくは以下に書いてある。
https://docs.djangoproject.com/ja/2.1/topics/signals/#receiver-functions

def receiver(sender, **kwargs):
    return print("success")
カスタムシグナルのconnect()を使った例

上記の準備したものを組み合わせると以下のようになる。

signal_instance..connect(receiver)

request_finishedでconnect()を使うまでの手順

レシーバの準備
def receiver(sender, **kwargs):
    return print("success")

レシーバを準備すればもうconnect()を使える。

request_finished.connect(receiver)

これから言えることはrequest_finishedはsignalインスタンスとして扱う。だからsignalインスタンスを作る手間を省くことができる。