sql >> データベース >  >> NoSQL >> Redis

DjangoChannels2のグループにメッセージを送信する

    私はこの質問を書いている間に解決策を見つけ、他の誰かもそれを利用するかもしれないと思いました!ここでの質問のほとんどは2.0以前のチャネルバージョンに関するものであるため、これがコンシューマーでgroup_sendイベントを処理する方法です。

    問題は、group_sendの使用方法だけではありませんでした。 ただし、関数ではありますが、グループクラス変数をEventConsumerに追加すると、自動的にその/それらのグループに追加されると誤って想定していましたが、そうではありません。 connectで手動でグループを追加する必要があります 関数をクラス化し、disconnectのグループを削除します 機能!

    問題は、私のコンシューマーに適切なイベントハンドラーが指定されていないことにもありました。アラーム要求が取り込まれるビューファイルで、「type」を「test」に設定しました。テストがEventConsumerクラスに反映されなかったため、イベントを処理できませんでした。ここの行番号146のマルチチャットの例に示されているように、ヘルパー関数は、送信されたイベントのタイプに応じて呼び出されます。したがって、「event.alarm」のイベントタイプには、対応するevent_alarmの関数が必要です。 あなたの消費者に!単純ですが、あまり文書化されていません:)。最終的な解決策は次のようになります。

    consumers.py内 、group_addに注意してください 接続およびgroup_discard 切断中!

    class EventConsumer(JsonWebsocketConsumer):
    
        def connect(self):
            async_to_sync(self.channel_layer.group_add)(
                'events',
                self.channel_name
            )
            self.accept()
    
        def disconnect(self, close_code):
            print("Closed websocket with code: ", close_code)
            async_to_sync(self.channel_layer.group_discard)(
                'events',
                self.channel_name
            )
            self.close()
    
        def receive_json(self, content, **kwargs):
            print("Received event: {}".format(content))
            self.send_json(content)
    
        # ------------------------------------------------------------------------------------------------------------------
        # Handler definitions! handlers will accept their corresponding message types. A message with type event.alarm
        # has to have a function event_alarm
        # ------------------------------------------------------------------------------------------------------------------
    
        def events_alarm(self, event):
            self.send_json(
                {
                    'type': 'events.alarm',
                    'content': event['content']
                }
            )
    

    したがって、上記の関数events_alarm 次のgroup_sendから呼び出されます :

    from django.shortcuts import HttpResponse
    
    from channels.layers import get_channel_layer
    
    from asgiref.sync import async_to_sync
    
    
    def alarm(req):
        layer = get_channel_layer()
        async_to_sync(layer.group_send)('events', {
            'type': 'events.alarm',
            'content': 'triggered'
        })
        return HttpResponse('<p>Done</p>')
    

    質問/回答についてさらに説明が必要な場合はお知らせください。乾杯!



    1. REDISハッシュのキーに複数の値を追加するクエリを作成しますか?

    2. マングースでのカスケードスタイルの削除

    3. MongoDBでデータを移行する方法

    4. mongo-java-driverのみを使用してMongoDBネイティブクエリ(JSON)を実行するにはどうすればよいですか?