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

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

    シグナルは、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と具体的なモデルを指定しました。このようなコードを書くことによって、具体的に実行するモデルを指定することができるようになります。

    約10時間の大ボリュームで、Djangoを基礎からしっかりと解説

    • ・3つのアプリの説明で【10時間超】
       徹底的に分かりやすさにこだわりました。
    • ・以下のボタンから購入すると、
       91%offの1,680円で受講できます。
    • ・さらに、30日以内であれば無条件で返金が可能。
    •  この機会にDjangoの理解を深めませんか?

    講義でお伝えしている内容(一部)をご紹介します。

    • 1. フレームワークの概要について
    • 2. Djangoの概要について
    • 3. Djangoで作成されたサイトの具体例
    • 4. 普通のウェブサイトとDjangoの違い
    • 5. startprojectとは
    • 6. localhostの概要
    • 7. 継承について
    • 8. BASI_DIRの概要
    • 9. アプリの概要
    • 10. models.pyファイルとは
    • 11. makemigrationsとmigrate
    • 12. CRUDの考え方
    • 13. 見た目を整える方法
    • 14. urlタグの使い方
    • 15. renderとは
    • 16. POSTとGETの違い
    • 17. Imageファイルの扱い方
    • 18. ログイン機能の実装
    • これらは講義の一部の内容です。
    • 30日以内であれば無条件で返金、リスクはありません。
    • 以下のボタンをクリックして、講義のサンプルをぜひご覧ください。