• シグナルの使い方を分かりやすく解説【サンプルコード付き】

    シグナルについて学んでいきましょう。

    シグナルは、httprequestがトリガーになって実行されるメソッド

    シグナルとは、httprequestがトリガーになって、指定したメソッドが実行される仕組みのことを言います。

    例えば、お問い合わせフォームがあり、送信ボタンを押すとそれがシグナルとなってメールが送信されるようにするという機能や、データベースにデータが保存されたことがシグナルとなり、特定のメッセージを表示させる。といったものです。

    これだけではイメージがわきづらいですので、実際のコードで実装していきましょう。

    シグナルの実装

    シグナルを実装するには、2つの方法があります。

    一つ目がconnectメソッドを使う方法。そしてもう一つがデコレータを使う方法です。

    デコレータを使った実装

    まずはデコレーターを使って実装してみましょう。

    コード
    

    -BASE/signalapp/views.py

    1 from django.core.signals import request_finished

    2 from django.dispatch import receiver

    3 from django.urls import HttpResponse

     

    4 @receiver(request_finished)

    5 def signalmethod(sender, **kwargs):

     6    print('シグナルが送られました。')

     

    7 def signalurl(request):

    8    return HttpResponse('return')

     

    コードの解説
    

    importしたモジュールの説明はのちほどしていきます。まずは仕組みをおさえていきましょう。

    (1) 4行目をみてみましょう。ここで、receiverデコレーターを実装しています。これは、トランシーバーのレシーバーのようなイメージで、どういったシグナルが送られてきたときに実行するかを指定しています。

    receiverの次のかっこの中はrequest_finishedとあります。これは、httprequestが行われた後にreceiverがシグナルを受け取ることを意味しています。

    (2) シグナルを受け取った時に実行される関数が5行目に書かれています。

    ここでは、シグナルが送られましたというメッセージが表示されるようにしています。

    (3) 7行目、8行目はfunction based viewです。リクエストを受け取ったら、ブラウザにreturnと表示されるようにしました。

    urls.pyファイルの設定

    次に、urls.pyファイルの設定を進めていきましょう。

    コード
    

    BASE/app/urls.py

    from django.urls import path

    from .views import signalurl, signalmethod

     

    urlpatterns = [

        path('sig/', signalurl, name= 'signal'),

    ]

    localhost:8000/sig/にアクセスすることで、signalurlsメソッドを呼び出すような設定をしました。

    サーバーにアクセスする

    シグナルの設定が完了したので、サーバーにアクセスしてみましょう。

    BASE

    $ python manage.py runserver

    そして、localhost:8000/sigにアクセスをしてみます。

    シグナルの表示

    ブラウザにはreturnが表示されました。

    次にコンソールを見てみましょう。

    シグナルの表示

    下の方に、「シグナルが送られました」という表示がされていることがわかります。

    httprequestが送られたことがシグナルとなり、ターミナルに「シグナルが送られました」という表示がされたことがわかります。

    違う方法でシグナルを使いこなす

    先ほどはデコレーターを使ってシグナルを使っていきましたが、もう一つの方法も見ていきましょう。

    メソッドを使う方法

    その方法とは、メソッドを使ってシグナルの処理をする方法です。

    コード
    

    from django.core.signals import request_finished

     

    def signalurl(sender, **kwargs):

        print('シグナルが送られました。')

     

    request_finished.connect(signalurl)

    これでも結果は同じです。request_finished(httprequestが完了した対mンぐ)がきっかけとなり、signalurlメソッドが呼び出されます。

    シグナルの種類を整理する

    ここからは、シグナルの種類についてみていきましょう。

    先ほどのrequest_finishedの部分を置き換えることによって、いろいろな場面でシグナルを使うことができるようになります。

    httprequest関連

    まずはhttprequest関連です。これは具体的には二種類あります。

    request_started

    httprequestが送られる前のタイミングで実行されるシグナルです。

    request_finished

    httprequestが送られた後のタイミングで実行されるシグナルです。

    モデル関連

    次はモデル関連です。データベースに関連して何らかの処理が行われたときに実行されます。

    pre_save

    モデルにデータが記録される前に実行されるシグナルです。

    post_save

    モデルにデータが記録された後に実行されるシグナルです。

    pre_delete

    モデルのデータが削除される前に実行されるシグナルです。

    post_delete

    モデルのデータが削除された後に実行されるシグナルです。

    特定のモデルに関連付けたいとき

    最後に、特定のモデルとシグナルを関連付けたいときの扱いについてみていきましょう。

    例えば、ユーザーモデルと商品モデルがあり、ユーザーモデルに変更があったとき(ユーザーの新規登録などがあった時)にシグナルを出したいといったイメージです。

    これは具体的なコードがあった方がわかりやすいと思います。

     

    コード
    

    @receiver(pre_save, sender=SampleModel)

    def signalmethod(sender, **kwargs):

        ...

     

    デコレーターの中で、sender=SampleModelと具体的なモデルを指定しました。このようなコードを書くことによって、具体的に実行するモデルを指定することができるようになります。

    ~Django無料講義~のご案内

    Code for Djangoが、4時間超の無料Django講義をはじめました

    •  ・本を出版したCode for Djangoの
       製作者が作ったサイトです。
    •  ・Code for Djangoの内容も、
       動画で詳しく解説しています。
    •  ・動画は順次ふやしていきますので、
       ただで学び続けることが可能です。
    •  ・Djangoの効率的なスキルアップに、
       是非お役立て下さい。