Разобрался с вопросом, может кому-то будет полезно. Джанго по умолчанию сохраняет данные о сессиях(только при условии, что вы что-то изменили в сессии) в модель 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 на крон каждый час. Таким образом можно посчитать кол-во юзеров за каждый час на опр. страницах