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