【Channels】Djangoアプリでリアルタイム更新処理を実装する

この記事では、Channelsモジュールを使用し、Djangoアプリでリアルタイム更新処理を実装する方法を解説します。

 

channelの実装の基本は公式ドキュメントで紹介されているチュートリアルの方法を利用します。

最終的には、フロントからのイベントではなく、Djangoアプリ内部からのイベントにより、対象のフロントのページをリアルタイムで更新できるような実装とします。

◆動作検証環境

・ローカル環境:mac Catalina
・Python:3.8.9
・Django:4.2.1
・channels : 4.0.0
・channels-redeis : 4.1.0
・daphne : 4.0.0・ redis-server : 7.0.1
スポンサードリンク

モジュールのインストール

channels、daphneのインストール

今回使用するchannelのバージョンは4.0.0となります。公式ドキュメントの方法に沿い以下のモジュールをインストールします。

 

Djangoのインストール

 

channels_redisのインストール

 

スポンサードリンク

redisのインストール

公式ドキュメントの方法ではDockerを利用する方法が紹介されていますが、今回はHomebrewのモジュールを利用する方法をとります。

 

以下のコマンドで起動します。

以下のコマンドの場合、macOS を再起動しても redis が自動的に起動します。

 

redisの起動を停止する際は以下のコマンドを実行します。

 

 

 

Djangoプロジェクトの作成と各ファイルの作成、編集

 

公式ドキュメントの方法に沿い、アプリやファイルを作成すると以下のような構成となります。

 

対応するファイルを編集していきます。

chat_test/settings.py

 

chat/templates/chat/index.html

 

chat/templates/chat/room.html

 

chat_test/urls.py

 

chat_test/asgi.py

 

 

chat/views.py

 

chat/urls.py

 

 

chat/consumers.py

 

chat/routing.py

 

 

プロジェクトの動作確認

 

DBのマイグレートを行った後、サーバーを起動し、動作を確認します。

サーバー起動時のコンソールに以下のような内容が表示され、ASGIとしてDaphneが利用されている事がわかります。

 

Djangoプロジェクト内でのwebsocket送信の実装

 

今回は、Djangoプロジェクト内でのwebsocket送信の動作確認のために、カスタムコマンドを利用して送信を行います。

カスタムコマンド使用のために、必要なディレクトリとファイルを作成します。

 

chat/management/commands/ws_test.py

 

上のコードで実行した場合、index.htmlで表示される「What chat room would you like to enter?」のインプット欄はlobby とする必あります。

これは、接続するグループをlobbyとしているためで、他の文字列をグループとして接続した場合、カスタムコマンドからの送信はおこなわれません。

 

chat room名を指定してwebsocketを接続してから、カスタムコマンドを実行すると、event_trigered_from_custom_command が表示されます。

 

上記のカスタムコマンドのコードは、consumer.py内のreceive関数とほぼ同じ実装内容となっております。

カスタムコマンドの場合、ChatConsumerクラスのインスタンス変数が使えないので、channel_layerをget_channel_layer()を利用して定義する事、WSのグループを予め決めていたものでハードコーディングしています。

 

 

以上、Channelsを用い、Djangoアプリでリアルタイム更新処理を実装する方法を解説しました。