22

django-notificationsと Web Sockets を使用して、iOS/Android および Web アプリにリアルタイム通知を送信することを検討しています。したがって、おそらくDjango Channelsを使用します。

Django Channelsを使用して、ユーザーのオンライン ステータスをリアルタイムで追跡できますか? はいの場合、サーバーを常にポーリングせずにこれを達成するにはどうすればよいですか?

適切な解決策を見つけることができなかったので、ベストプラクティスを探しています。

更新

これまでに試したことは次のアプローチです。Django Channels を使用して、接続'online'時にユーザー ステータスを に設定し、ソケットが切断されるとユーザー ステータスを に設定する WebSocket コンシューマを実装しました'offline'。もともとステータスを含めたかったの'away'ですが、私のアプローチではそのような情報を提供できません。また、ユーザーが複数のデバイスからアプリケーションを使用する場合、私の実装は正しく機能しません。これは、あるデバイスで接続を閉じても、別のデバイスで開いたままにすることができるためです。'offline'ユーザーが別の接続を開いている場合でも、ステータスは に設定されます。

class MyConsumer(AsyncConsumer):

    async def websocket_connect(self, event):
        # Called when a new websocket connection is established
        print("connected", event)
        user = self.scope['user']
        self.update_user_status(user, 'online')

    async def websocket_receive(self, event):
        # Called when a message is received from the websocket
        # Method NOT used
        print("received", event)

    async def websocket_disconnect(self, event):
        # Called when a websocket is disconnected
        print("disconnected", event)
        user = self.scope['user']
        self.update_user_status(user, 'offline')

    @database_sync_to_async
    def update_user_status(self, user, status):
        """
        Updates the user `status.
        `status` can be one of the following status: 'online', 'offline' or 'away'
        """
        return UserProfile.objects.filter(pk=user.pk).update(status=status)

:

私の現在の作業ソリューションは、Django REST フレームワークと API エンドポイントを使用して、クライアント アプリが現在のステータスで HTTP POST 要求を送信できるようにすることです。たとえば、Web アプリはマウス イベントを追跡し、常にonlineX 秒ごとにステータスを POST し、マウス イベントがなくなるとawayステータスを POST し、タブ/ウィンドウが閉じようとすると、アプリは POST リクエストを status と共に送信しますoffline。これは有効なソリューションです。ブラウザによっては、offlineステータスを送信するときに問題が発生しますが、機能します。

私が探しているのは、サーバーを常にポーリングする必要のない、より優れたソリューションです。

4

2 に答える 2