Djangoで、Webサイトの更新情報を通知するシリーズ

2019-07-27 / Djangoシリーズ・まとめ

概要

Webサイトでは、更新をお知らせする機能がよくあります。例えばメールで最新情報を知らせたり、最近ではLineやブラウザのプッシュ通知で更新情報をお知らせする例もよく使われています。このブログにも、ブログの購読ページがありますね。

今回は、それらの機能をDjangoで実装する方法をまとめていきます。ソースコードをGithubに置いているので、欲しい方はクローンしてください。

次のように、幾つかの種類で新着記事を受け取れるようにして...

Django管理サイトで、記事を通知すると... Django管理サイトで任意のアクションを実装

メールやLine、ブラウザ通知でお知らせが届きます。

URL定義の作成

アプリケーションのurls.pyを、次のようにしておきます。

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('', views.subscribe, name='subscribe'),  # 購読ページ

    # resolve_url()等で使えるように、便宜的に定義
    path('list/', views.PostIndex.as_view(), name='list'),
    path('detail/<int:pk>/', views.PostDetail.as_view(), name='detail'),
]

urlpatternsの一番上は購読ページのURL定義です。購読ページでは、メールアドレスやライン、ブラウザ通知の登録をしてもらいます。

通知の際、最新記事のURLも通知したいと考えています。「新着記事のお知らせ! 続きは https://narito.ninja/blog/detail/56/ で!」みたいな感じでメッセージを送ります。ということは、{% url %}とかresolve_url()等で記事詳細ページURLの逆引きができなければなりません。なので、上のようにURL定義をしておく必要がありました。

ビューの作成

次のようなビューを作っておきます。

from django.shortcuts import render
from django.views import generic
from .models import Post


def subscribe(request):
    return render(request, 'blog/subscribe.html')


class PostIndex(generic.ListView):
    model = Post


class PostDetail(generic.DetailView):
    model = Post

subscriveビューは、購読ページですね。PostIndexPostDetailビューは先ほど説明したように、便宜上必要なので作っています。シンプルにクラスベースビューを使って作りました。

テンプレートファイルの作成

ベーステンプレートファイルを作っておきます。base.htmlです。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>購読サンプル</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

次に、購読ぺージのテンプレートファイルを作成します。subscribe.htmlです。

{% extends 'blog/base.html' %}

{% block content %}
    <h2>メールで新着記事を受け取る</h2>

    <h2>Lineで新着記事を受け取る</h2>

    <h2>プッシュ通知で新着記事を受け取る</h2>

    <h2>ブログ記事 フィード</h2>
{% endblock %}

購読ページのテンプレートファイルは、また後々編集していきます

便宜上必要なpost_list.htmlは、次のように適当に作っておきます。

{% extends 'blog/base.html' %}

{% block content %}
    {% for post in post_list %}
        <p><a href="{% url 'blog:detail' post.pk %}">{{ post.title }}</a></p>
    {% endfor %}
{% endblock %}

post_detail.htmlは、次のように、適当に。

{% extends 'blog/base.html' %}

{% block content %}
    <h1>{{ post.title }}</h1>
    <p>{{ post.text }}</p>
{% endblock %}

サンプルモデル

ちょっとしたブログがあり、最新記事を通知するというケースでやっていきます。次のような、記事のモデルがあるとします。

from django.db import models
from django.utils import timezone


class Post(models.Model):
    title = models.CharField('タイトル', max_length=255)
    text = models.TextField('本文')
    created_at = models.DateTimeField('作成日', default=timezone.now)

    def __str__(self):
        return self.title

    def email_push(self, request):
        pass

    def line_push(self, request):
        pass

    def browser_push(self, request):
        pass

email_push()line_push()browser_push()の3つメソッドは、その記事を通知するためのメソッドです。中身は、あとで実装していきます

通知アクションの作成

admin.pyにて、次のようにしておきます。

from django.contrib import admin
from .models import Post


def notify(modeladmin, request, queryset):
    for post in queryset:
        post.line_push(request)
        post.browser_push(request)
        post.email_push(request)


class PostAdmin(admin.ModelAdmin):
    actions = [notify]


notify.short_description = '通知を送信する'
admin.site.register(Post, PostAdmin)

admin.ModelAdminactionsという属性を指定すると、Django管理サイトで任意のアクションを実装できます。具体的には、次のようなことができるようになります。 Django管理サイトで任意のアクションを実装

これにより、admin.pynotify()が呼ばれます。選んだデータ達はqueryset引数として渡されています。そして、Postモデルに定義した各通知用のメソッドが呼ばれ、実際に通知が送信されるという仕組みです。上で書いたように、各通知用のメソッドはまだ空ですので、後で実装していきます。

このnotifyアクションは、Django管理サイト上から通知を送るために実装しました。もちろん、通知を送信するための自作ビューを作り、そこから送信しても良いでしょう。

メール通知

Webサイトの更新情報を、単純にメールでお知らせるするケースもよくあります。実装もシンプルなので、オススメです。詳しい内容は、 Django、メールで更新を通知をご覧ください。

Line通知

この方法は、ドメインの取得とHTTPSの対応が必要です。

LineでWebサイトの更新を通知します。Lineは最早殆どの人が使っているツールで、この方法を好むユーザーも多いです。詳しい内容は、 Django、Lineで更新を通知をご覧ください。

ブラウザ通知

この方法は、ドメインの取得とHTTPSの対応が必要です。

Webブラウザのプッシュ通知も、最近は多くなりました。ブラウザの機能ではありますが、ブラウザを閉じていても動作しますので、ご安心ください。導入の仕方は、 Django、OneSignalでブラウザ通知をご覧ください。

フィード

Webサイトの更新情報をRSSAtomといった形式のファイルで配信しておけば、ユーザーはフィードリーダーを使って読み込むことで、Webサイトの更新を受け取ることができます。

Djangoにはフィードを作成する機能が標準で組み込まれており、過去に作った記事があるので、紹介します。

Djangoで、配信フィードを生成する

この記事の関連記事

Djangoで、配信フィードを生成する

2018-11-05 / PythonDjango

- Djangoは配信フィードを自動生成する機能が標準で組み込まれており、その使い方を紹介していきます。

Django、Lineで更新を通知

2019-07-27 / PythonDjangoLine

- Djangoで、Webサイトの更新情報を通知するシリーズの一つです。Lineで、Webサイトの更新を伝えていきます。

Django、OneSignalでブラウザ通知

2019-07-27 / PythonDjango

- Djangoで、Webサイトの更新情報を通知するシリーズの一つです。OneSignalを利用してブラウザのプッシュ通知を行い、Webサイトの更新を伝えます。

コメント欄

記事にコメントする

まだコメントはありません。