15

私は、ドキュメントを読んだり、例をいじったりするなど、django-channelsを試してきました。

新しいインスタンスをデータベースに保存することによってトリガーされる単一のユーザーにメッセージを送信できるようにしたいと考えています。

私のユースケースは、(セロリタスクを介して) 新しい通知を作成し、通知が保存されると、この通知を単一のユーザーに送信します。

これは可能のように思えます ( django-channels docsから)

...重要な部分は、任意のイベント (作成したイベントを含む) に応答してコードを実行できる (そしてチャネルに送信できる) ことです。モデルの保存、他の受信メッセージ、またはビューとフォーム内のコード パスからトリガーできます。

ただし、ドキュメントをさらに読んでdjango-channels examplesをいじってみると、これを行う方法がわかりません。databinding と liveblog の例は、グループへの送信を示していますが、単一のユーザーに送信する方法がわかりません。

4

6 に答える 6

19

その特定のユーザーのグループを作成するという @Flip の回答を拡張します。

ws_connect 関数の python 関数では、そのユーザーをそのユーザー専用のグループに追加できます。

消費者.py

from channels.auth import channel_session_user_from_http
from channels import Group

@channel_session_user_from_http
def ws_connect(message):
    if user.is_authenticated:
        Group("user-{}".format(user.id)).add(message.reply_channel)

そのユーザーに Python コードからメッセージを送信するには:

私のview.py

import json
from channels import Group

def foo(user):
    if user.is_authenticated:
        Group("user-{}".format(user.id)).send({
            "text": json.dumps({
            "foo": 'bar'
        })
    })

接続されている場合は、メッセージを受信します。ユーザーが Websocket に接続されていない場合、サイレントに失敗します。

また、各ユーザーのグループに 1 人のユーザーのみを接続するようにする必要があります。そうしないと、特定のユーザーのみを対象としたメッセージを複数のユーザーが受信する可能性があります。

django チャネルの例、特にルーティングの実装方法、クライアント側での websocket 接続の作成方法、および django_channels の設定方法については、マルチチャットを参照してください。

django channels docsも確認してください。

于 2016-09-23T19:28:24.880 に答える
5

最善の方法は、その特定のユーザーのグループを作成することです。ws_connect のときに、そのユーザーを追加できますGroup("%s" % <user>).add(message.reply_channel)

注: 私の websocket url はws://127.0.0.1:8000/<user>

于 2016-09-09T06:34:07.800 に答える