Как определить, находится ли пользователь все еще в сети с сеансом django

#python #django #authentication #session #middleware

#python #джанго #аутентификация #сеанс #промежуточное программное обеспечение

Вопрос:

Я использую Django 2.2 и пытаюсь определить, подключен ли пользователь, когда пользователь закрывает свой браузер, не выходя из системы. Я пытался использовать некоторые пакеты Django, такие как qsessions, но их нужно заменить 'django.contrib.sessions.middleware.SessionMiddleware', промежуточным программным обеспечением qsession, но это приводит к другой ошибке django.contrib.sessions.middleware.SessionMiddleware not found . Мне нужна ваша помощь, чтобы получить каждый сеанс пользователя отдельно.

Ответ №1:

Сеансы Django не предназначены для запроса их содержимого. Идентификатор пользователя в сеансе может быть декодирован из сеанса, но вам нужно выполнить итерацию по всем сеансам:

 from django.contrib.sessions.models import Session
from django.utils import timezone

def get_unexpired_sessions_for_user(user):
    user_sessions = []
    all_sessions = Session.objects.filter(expire_date__gte=timezone.now())
    for session in all_sessions:
        session_data = session.get_decoded()
        if user.pk == session_data.get('_auth_user_id'):
            user_sessions.append(session.pk)
    return Session.objects.filter(pk__in=user_sessions)
 

Этот подход будет работать, но не будет эффективным, если в вашей базе данных много сеансов.

Комментарии:

1. Спасибо, Стефан, за ваш ответ, но если эта функция может замедлить работу веб-сайта, так какой способ хорошо работает без пользовательских сеансов, которые используются в приложении чата?