Я рассматриваю возможность использования django-уведомлений и веб-сокетов для отправки уведомлений в реальном времени в iOS/Android и веб-приложения. Поэтому я, вероятно, буду использовать Django Channels.
Могу ли я использовать каналы Django для отслеживания состояния онлайн-пользователя в режиме реального времени? Если да, то как я могу достичь этого без постоянного опроса сервера?
Я ищу наилучшую практику, так как я не смог найти правильное решение.
ОБНОВЛЕНИЕ:
То, что я пробовал до сих пор, заключается в следующем: используя Django Channels, я внедрил потребителя WebSocket, который при подключении установит статус пользователя на 'online'
, а когда сокет будет отключен, статус пользователя будет установлен на '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 Framework с конечной точкой API, чтобы клиентские приложения отправляли HTTP-запрос POST с текущим статусом. Например, веб - приложение отслеживает события мыши и постоянно по месту службы online
Статус каждые Х секунд, когда нет больше событий мыши не POST на away
состояние, когда вкладка/окно собирается быть закрыты, приложение отправляет запрос POST со статусом offline
. Это рабочее решение, в зависимости от браузера у меня возникают проблемы при отправке offline
состояния, но он работает.
То, что я ищу, - лучшее решение, которое не требует постоянного опроса сервера.