Djangoで動的にLINE Flex Messageを扱う際のベストプラクティス


どうもこんにちは!
初めてQiitaに投稿するので、軽く自己紹介を。
某情報連携学部に通う学生です。(某と言っても…)
好きなブラウザはFirefoxとEdge(Chromium)です。

さて、弊学部では一年生の後半に、全員が授業でDjangoを用いたチーム開発を行います。
私は昨年LINE botを作成したのですが、その際、DjangoでLINE Messaging APIのFlex Messageを動的に扱う上手いやり方が調べても出てこなかったので、個人的に考えたベストプラクティスを備忘録も兼ねてここに記します。
Flex Messageについてはこちらを参照。

アプローチ

DjangoにはDjango Template Languageというテンプレート言語が用意されています。また、LINE Messaging APIのFlex MessageはJSON形式で記述します。
それらを用いて、Djangoサーバーがメッセージを送信する時に、雛形のJSONファイルに情報を埋めてFlex Messageを送るというアプローチを取りたいと思います。
(DjangoでHTMLファイルを扱う時と同じ感じですね)

具体的な方法

DjangoでHTMLファイルに情報を埋めて送信するには通常render()などを使うと思いますが、これはHTTPレスポンスを行うものなので今回は使いません。代わりにrender_to_string()を使います。

今回は以下の画像のように、送った文と日付をFlex Messageで表示するbotを例に挙げます。

なお、例に用いたmessage.jsonとviews.py全文はGitHub Gistにおいてあります。

コード例

LINE公式のサンプルコードをDjangoに合わせて少し改変したものです。

import json
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from django.template.loader import render_to_string
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.models import (
    MessageEvent, TextMessage, FlexSendMessage, BubbleContainer
)

#settings.pyからアクセストークンなどを取得(ここはお好みで)
line_bot_api = LineBotApi(channel_access_token=settings.LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(channel_secret=settings.LINE_CHANNEL_SECRET)

#(省略)

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    msg_text=event.message.text
    today_date = datetime.datetime.now()
    msg = render_to_string("message.json", {"text": msg_text, "date": today_date})
    line_bot_api.reply_message(
        event.reply_token,
        FlexSendMessage(alt_text = msg_text, contents = json.loads(msg))
    )

重要なのはここです

msg_text=event.message.text
today_date = datetime.datetime.now()
msg = render_to_string("message.json", {"text": msg_text, "date": today_date})

templatesフォルダ下に置かれたmessage.jsonの{{ text }}の部分に、LINEに入力した内容であるmsg_textが、{{ date }}の部分に、現在日時であるtoday_daterender_to_string()によって埋められるようになっています。

まとめ

以上がDjangoで動的にLINE Flex Messageを扱う際の個人的なベストプラクティスになります。
お役に立ったらうれしいです。

参考