Djangoで作成した掲示板に投稿通知機能を追加します。
作成した掲示板はこんな感じになります。 ⇒ 動作確認はこちらから
Contents
掲示板に投稿通知機能を追加する
今回追加しようとしている通知機能は誰が投稿するとその内容が管理人に通知するというものです。現在、公開している掲示板は誰でもアカウントを作成して書き込むことができます。
世の中 善人ばかりではない
世の中にいる人のすべてが善人であるなんてことはありません。一定の割合で悪意をもった人がいるものです。彼らのなかには差別を煽ったり犯罪を助長する内容の書き込みをする人がいます。それに管理人が気づくことができないと彼らの書き込みがそのまま残ります。管理人も管理者として責任を追及されることになります。
そこでおかしな書き込みがされたときに、すぐに気がつけるようにこの機能を追加します。
それからアクセスログは残るのであまりにひどい書き込みをした場合は通報します。「おい、鳩。つまんない記事ばっかり書いてんじゃねえよ。バーーーカ」程度であれば許容の範囲内ですが、差別を扇動したり犯罪を助長するような内容の場合は最悪、警察署でおいしいご飯を食べることになるので気をつけてくださいね♪
具体的な方法ですが、
メールを送信できるようにする
新規作成または更新がされたらメールを管理人に送信する
このような処理をここではおこないます。
settings.pyの編集
メールを送信するためには内側のmyappディレクトリ内にあるsettings.pyを編集します。以下の7行を追加してください。
これはGmailでメールを送信するための設定です。
1 2 3 4 5 6 7 |
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_HOST_USER = 'XXXX@gmail.com' EMAIL_USE_TLS = True EMAIL_HOST_PASSWORD = 'あなたのパスワード(後述)' DEFAULT_FROM_EMAIL = 'XXXX@gmail.com' |
Articleクラスの編集
次にbbsディレクトリ内のmodels.pyを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
from django.db import models from django.urls import reverse # 追加 from django.conf import settings from django.core.mail import EmailMessage import asyncio import os os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" # 追加ここまで class Article(models.Model): # get_absolute_url(self):を変更する。それ以外はそのまま title = models.CharField(verbose_name='タイトル', max_length=200, null = True, ) content = models.TextField(verbose_name='本文', max_length=1000, ) author = models.ForeignKey( 'auth.User', on_delete=models.CASCADE, null = True ) created_at = models.DateTimeField(auto_now_add=True, null = True) updated_at = models.DateTimeField(auto_now=True, null = True) def __str__(self): return self.content # ここから変更 def get_absolute_url(self): asyncio.run(self.send_email()) return reverse('bbs:detail', kwargs={'pk': self.pk}) async def send_email(self): subject = '投稿通知' message = '【タイトル】:' + self.title + '\n' message += '【投稿者】:' + str(self.author) + '\n' message += '【本文】:' + '\n' + self.content email = EmailMessage(subject, message, settings.DEFAULT_FROM_EMAIL, ['更新通知をうけとりたいメールアドレス']) email.send() |
新規投稿または更新されるときにget_absolute_url関数が実行されるので、そのときに投稿の内容とタイトル、投稿者のアカウント名を取得してメール送信しています。
ただ、実際に更新すると更新通知のメールが送られるのかというとエラーになってうまくいかない場合があります。また送信元に「重大なセキュリティ通知」という件名のメールが届く場合があります。
このような場合はGMailの設定を変える必要があります。
メールが送信できない場合は?
メールを送信することができない場合は、パスワードが間違っていないか? アカウント名を間違っていないか? 入力ミスがないかを確認してください。セキュリティ関連のエラーが出る場合は、アプリパスワードを使用することで解決します。
アプリパスワードを設定する
アプリパスワードとは、今回のDjangoによるメールの送信のように、アプリが使用するためだけのパスワードです。これはGoogleアカウントにログインするときに入力するパスワードとは別物です。
まずはGoogleアカウントにログインした後
https://myaccount.google.com/security
にアクセスします。
すると二段階認証を使用する設定をしていないのであれば、下の画像のようなものが表示されるはずです。
これを下のほうへスクロールしていくと
赤枠部分をクリックすると
これを下のほうへスクロールしていくと
ボタンをクリックすると遷移先のページの下部に電話番号を入力する欄があります。ここに電話番号を入力してメッセージを送信させます。
電話番号を入力したらメッセージが送信されるので、そこに書かれているコードを入力します。
すると二段階認証が有効になるので 左上の戻る矢印をクリックします。
すると
下にスクロールしてアプリパスワードをクリックします。
「アプリを選択」のプルダウンで「メール」を「デバイス選択」のプルダウンでは各自が使用しているデバイスを選択します。
すると生成されたパスワードが表示されます。
あとは取得したパスワードを内側のmyappディレクトリ内にあるsettings.pyに記述します。
1 |
EMAIL_HOST_PASSWORD = 'あなたが取得したパスワード' |
これでだれかが新規投稿をしたり更新をするたびにメールで更新通知が来るようになります。