Работа с сессиями в django. Как отследить кол-во юзеров на странице за час и кол-во активных юзеров на странице за 24 часа?

Доброго времени суток. Задачу описал в вопросе. Предположим у меня есть 2 страницы и на них нужно все это отследить, изначально была идея делать как-то так
request.session['моя страница'] = True
Но все мои сессии хранятся в бд в виде кэша, соответственно мне придется декодировать каждую запись, чтобы получить словарь, отследить значение и посчитать. Это вроде как много кода и неэффективно. Даже на уровне идеи не понимаю, как это правильно реализовать.
  • Вопрос задан
  • 1846 просмотров
Решения вопроса 1
@YraganTron Автор вопроса
Разобрался с вопросом, может кому-то будет полезно. Джанго по умолчанию сохраняет данные о сессиях(только при условии, что вы что-то изменили в сессии) в модель Session.
Я сделал таблицу MySession
class MySession(models.Model):
    session_key = models.ForeignKey(Session) # Связь с таблицой Session
    name_board = models.CharField(max_length=1024) #Страницы для отслеживания
    expire_date = models.DateTimeField() # Время жизни
    active = models.CharField(max_length=1024, blank=True) #Отслеживание действий на странице
    thread = models.TextField(blank=True) #Страницы для отслеживания


После чего во вьюхе описываю работу с сессиями и Mysession.
request.session.set_expiry(3600) #Задаю нужное мне время жизни сессии
    request.session.save()

    if len(MySession.objects.filter(session_key=request.session.session_key)) != 0:  # Проверяю, есть ли информация о данной сессии в Mysession, и есть ли информация о посещении данной страницы. Если информация нет, то добавляю.
        session = MySession.objects.get(session_key=request.session.session_key)
        if name_board in session.name_board:
            pass
        else:
            session.name_board += ', ' + name_board
        session.save()
    else:        MySession.objects.create(session_key=Session.objects.get(pk=request.session.session_key), name_board=name_board, expire_date=Session.objects.get(pk=request.session.session_key).expire_date)
        session = MySession.objects.get(session_key=request.session.session_key)
        session.save()


Дальше я создаю собственную команду django, для удаления всех сессий чьё время жизни истекло и дальнейшим подсчетом кол-ва оставшихся сессий. Считать буду через сигналы
usr_hour = Signal(providing_args=[]) # Создание сигнала

class Command(BaseCommand):

    def handle(self, *args, **options):
        now = timezone.now() # Задаю время для проверки жизни сессий
        two_hour = now - datetime.timedelta(hours=2)
        MySession.objects.filter(expire_date__range=(two_hour, now)).delete()
        Session.objects.filter(expire_date__range=(two_hour, now)).delete()

        usr_hour.connect(my_callback) #отправляю сигнал
        usr_hour.send(sender=self.__class__)
        usr_hour.disconnect(my_callback)

        self.stdout.write('Succes')


Сигнал
def my_callback(sender, **kwargs):
    boards = Board.objects.all()
    for x in boards:
        x.board_in_hour = MySession.objects.filter(name_board__contains=x.board_shortcut).count()
        x.save()


Добавляю запуск команды db_hour на крон каждый час. Таким образом можно посчитать кол-во юзеров за каждый час на опр. страницах
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы