Django - Урок 048. Как добавить статус онлайн на сайте

Auth, Django, Backend, Python

Долгое время не добавлял подобный функционал на сайте по той простой причине, что не знал, с какой бы стороны к этому подойти, поскольку хотелось бы обрабатывать данную информацию в одном единственном месте, а не в каждом View.

Со временем я начал модифицировать Backend классы для сайта и решение пришло само собой. Нужно было всего лишь модифицировать каждый бэкенд аутентификации, который используется на сайте. И переписать метод get_user, в котором будет сохраняться информация о последнем запросе пользователя к сайту. А статус онлайн можно сохранять последние 15 минут, потом статус будет оффлайн.

А дату последнего запроса можно хранить либо в профиле пользователя, который будет OneToOne моделью к пользователю, либо переопределить модель пользователя. Я выбрал вариант с переопределением модели пользователя.

my_auth

Создадим наш собственный модуль аутентификации my_auth, если вы его ещё не создали

python manage.py startapp my_auth

models.py

После чего переопределим модель пользователя

# -*- coding: utf-8 -*-

from django.contrib.auth.models import AbstractUser
from django.contrib.humanize.templatetags.humanize import naturaltime
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _


class User(AbstractUser):

    last_online = models.DateTimeField(blank=True, null=True)

    # В данном методе проверяем, что дата последнего посещения не старше 15 минут
    def is_online(self):
        if self.last_online:
            return (timezone.now() - self.last_online) < timezone.timedelta(minutes=15)
        return False

    # Если пользователь посещал сайт не более 15 минут назад, 
    def get_online_info(self):
        if self.is_online():
            # то возвращаем информацию, что он онлайн
            return _('Online')
        if self.last_online:
            # иначе пишем сообщение о последнем посещении
            return _('Last visit {}').format(naturaltime(self.last_online))
            # Если вы только недавно добавили информацию о посещении пользователем сайта
            # то для некоторых пользователей инфомации о посещении может и не быть, вернём информацию, что последнее посещение неизвестно
        return _('Unknown')

backends.py

Далее напишем собственный бэкенд аутентификации, который будет заменять бэкенд Django.

# -*- coding: utf-8 -*-

from django.contrib.auth import get_user_model
from django.utils import timezone


class MyBackend:

    def get_user(self, user_id):
        try:
            user = get_user_model().objects.get(pk=user_id)
            user.last_online = timezone.now()  # При запросе пользователя выполним обновлении даты и времени последнего посещения
            user.save(update_fields=['last_online'])
            return user
        except get_user_model().DoesNotExist:
            return None

settings.py

Не забываем зарегистрировать наше приложение ...

INSTALLED_APPS = [
    'my_auth.apps.MyAuthConfig',
    ...
]

... и добавить бэкенд аутентификации

AUTHENTICATION_BACKENDS = (
    'my_auth.backends.MyBackend',
    'django.contrib.auth.backends.ModelBackend',
)

Заключение

Теперь при каждом запросе пользователя к сайту у вашего пользователя будет обновляться информация о его последнем посещении.

И вы сможете в шаблоне делать у пользовтелей в контенте, находится ли он онлайн или нет. Например так, чтобы добавить значок Online у аватарки

{% if user.is_online %}
    <div class="online"></div>
{% endif %}

или так отображать информацию о его онлайн статусе.

<span class="text-muted">{{ user_profile.get_online_info }}</span>

Возможный недостаток данного метода заключается в том, что пользователь может открыть страницу и ничего не делать целый час на ней.
Но в моём случае это не является проблемой, поскольку я каждую минуту вызываю проверку статусной информации у аутентифицированного пользователя, таким образом, пока страница пользователя остаётся открытой, каждую минуту обновляется его статус онлайн.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- блог компании
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

ЛП
12 ноября 2019 г. 8:22
Лев Пархимович

C++ - Тест 006. Перечисления

  • Результат:50баллов,
  • Очки рейтинга-4
ЛП
12 ноября 2019 г. 7:35
Лев Пархимович

C++ - Тест 005. Структуры и Классы

  • Результат:66баллов,
  • Очки рейтинга-1
ЛП
12 ноября 2019 г. 7:26
Лев Пархимович

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
b
9 ноября 2019 г. 8:28
bastonc

спасибо ещё раз. огромное, за уделённое время
b
9 ноября 2019 г. 8:24
bastonc

Спасибо Вам большое. Буду изучать.
9 ноября 2019 г. 5:58
Евгений Легоцкой

Добрый день. По первым двум вопросам вы найдёте ответ в этой статье - PyQt5 - Урок 008. Работа с QTableWidget (Обновление урока 006) Что касается последнего вопроса, то я вам…
9 ноября 2019 г. 2:50
Евгений Легоцкой

Как и обещал, вы можете посмотреть новую статью QML - Урок 037. Кастомизация кнопок в QML (Обновление урока 002) . Там же найдёте ссылку на Git репозиторий. Не забудьте поставить звёз…
b
8 ноября 2019 г. 7:40
bastonc

Приветствую. Подскажите пожалуйста пару моментов. 1. Как сделать столбец не редактируемый, а остальные ячейки остаются редактируемыми 2. Как оталвливать события двойного клика для реда…
Сейчас обсуждают на форуме
14 ноября 2019 г. 4:23
Ruslan Polupan

Я уже понял это, ковыряюсь сижу....
14 ноября 2019 г. 3:56
Евгений Легоцкой

Добрый день. Я уже очень давно не создавал инсталляторы, но на данный момент поведение Maintenance Tool выглядит так, что он имеет свой собственный пакет в репозитории. Но честно, я могу с…
14 ноября 2019 г. 2:16
Ruslan Polupan

посмотрите тут http://www.prog.org.ru/topic_6637_15.html И гдето на Гитхабе я видел исходни класса который это реализует
13 ноября 2019 г. 9:33
Pavel.K

Приложение трэкинг задач. Есть вложения. Добавляем вложение и отправляем его на сервер. Для синхронного вызова методов в синхронизации, используем QEventLoop при отправке вложений. В момент син…
13 ноября 2019 г. 3:13
Евгений Легоцкой

Добрый день. Думаю, что да. Выбранный стиль можно подгружать при запуске программы. Во всяком случае, есть такой пример на C++ - Controls Gallery . И там есть такой код #incl…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB