3

127.0.0.1:8000/dashboard/にライン座標を入力するフォームと、座標を送信するための「OK」ボタンがあります。view を呼び出すことにより、座標が127.0.0.1:8000/api/line/LineDisplay()にポストされます。ここで、Line 座標を127.0.01:8000/dashboard/に戻します。

これまでに次のことを行いました。

urls.py:

from django.conf.urls import url,include
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^api/line/$',views.LineDisplay.as_view()),
]

ビュー.py:

class LineDisplay(APIView):
"""
Display the most recent line
"""

    def get(self, request, format=None):
        lines = Line.objects.all()
        serializer = LineSerializer(lines, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        lines = Line.objects.all()
        for line in lines:
            line.delete();
        serializer = LineSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
        info = ""
        info += "Line Coordinates are: "
        lines = Line.objects.all()
        for line in lines:
            info += "x1:" + str(line.x1)
            info += " y1:" + str(line.y1)
            info += " x2:" + str(line.x2)
            info += " y2:" + str(line.y2)
        print info
        Channel('repeat-me').send({'info': info, 'status': True})
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

消費者.py

import json

# In consumers.py
from channels import Group

# Connected to websocket.connect
def ws_add(message):
    Group("chat").add(message.reply_channel)

# Connected to websocket.receive
def ws_message(message):
     print "Receive Message now"
     Group("chat").send({
        "text": json.dumps({'status': False})
    })
# Connected to websocket.disconnect
def ws_disconnect(message):
    Group("chat").discard(message.reply_channel)


def repeat_me(message):
    Group("chat").send({
    "text": json.dumps({'status': message.content['status'], 'info':      
     message.content['info']})
     })

同様に、routing.py に次のコードを追加しました。

from channels.routing import route
from .consumers import ws_add, ws_message, ws_disconnect, repeat_me

channel_routing = [
    route("websocket.connect", ws_add),
    route("websocket.receive", ws_message),
    route("websocket.disconnect", ws_disconnect),
    route("repeat-me", repeat_me),
]

次の行が settings.py に追加されました。

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgiref.inmemory.ChannelLayer",
        "ROUTING": "TrainingInduct.routing.channel_routing",
    },
}

現在、グループ「チャット」の扱い方がわかりません。グループもいらない。新しい行が投稿されたらすぐに行の座標が127.0.0.1:8000/dashboard/に表示されるようにするには、あと何をすればよいでしょうか?

注: ライン座標は/api/line/に適切にポストされています。チャネルからデータを取得してプッシュバックするために、サーバー コードを作成する必要があると思います。よろしいですか? ありがとう。

4

1 に答える 1

5

あなたの情報を受け取る必要があるすべてのチャネルを収集するには、グループが必要です。接続された各デバイスは、1 つのチャネルを取得します。

デバイスのチャネル ID はmessage.reply_channel. グループは、すべての を収集する方法にすぎませmessage.reply_channelん。

したがって、あなたの/dashboard/ページを開いたユーザーは、投稿された新しい「情報」アイテムを受け取るとしましょう。まず、新しいクライアントのチャンネルを覚えておく必要があります。それがあなたのws_add目的です

def ws_add(message):
    Group("all-my-clients").add(message.reply_channel)

これで、接続したばかりのクライアントがall-my-clientsグループの一部になり、 経由all-my-clientsで送信するメッセージはすべて、そのクライアントにも自動的に送信されます。

もちろん、自分で後片付けをしたいので、それws_disconnectが目的です。クライアントが WebSocket.close() を実行したり、ブラウザを閉じたりしたら、クライアントを削除します。

def ws_disconnect(message):
    Group("all-my-clients").discard(message.reply_channel)

最後に、あなたのws_message(). 着信メッセージを受信します。

def ws_message(message):
    # Nothing to do here, because you only push, never receive.
    pass

それで全部です。これで、上で定義したグループに、Django のどこからでもメッセージを送信できます。必ず正しい形式で応答を送信してください。は、文字列値を持つキーで をGroup().send()受け取ります (以下を参照)。その理由は、ブロブなどの他のデータ型も送信できるからです。しかし、この目的には「テキスト」が最適です。dicttext

def post(self, request, format=None):
    lines = Line.objects.all()
    ...
    print info
    response_data = {'info': info, 'status': True}
    Group("all-my-clients").send({
        'text': json.dumps(response_data)
    })
    return Response(serializer.data, status=status.HTTP_201_CREATED)

それだけです。

于 2016-08-14T16:49:37.590 に答える