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

    @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 на крон каждый час. Таким образом можно посчитать кол-во юзеров за каждый час на опр. страницах
    Ответ написан
    Комментировать