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 アプリはマウス イベントを追跡し、常にonline
X 秒ごとにステータスを POST し、マウス イベントがなくなるとaway
ステータスを POST し、タブ/ウィンドウが閉じようとすると、アプリは POST リクエストを status と共に送信しますoffline
。これは有効なソリューションです。ブラウザによっては、offline
ステータスを送信するときに問題が発生しますが、機能します。
私が探しているのは、サーバーを常にポーリングする必要のない、より優れたソリューションです。