Django как реализовать автовыход и автологин вместе?

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

Проблема

1- Необходима функция автоматического выхода из системы после 1 часа бездействия. Реализовано и работает.

2- Нужна функциональность автоматического входа. То есть если пользователь не вышел из системы, закрыл вкладку и пытается зайти на /login url, то он должен попасть на приборную панель, так как он не выходил из системы. Реализовано и работает.

Обе эти функции работают, но не тогда, когда они реализованы вместе.

Что было реализовано?

1- Для выхода из системы:

SESSION_COOKIE_AGE = 60*60
SESSION_SAVE_EVERY_REQUEST = True

Выполнено в settings.py.

2- Для входа в систему:

В моей функции login view в POST случае я реализовал cookies. Я устанавливаю cookies для имени пользователя, используя

response.set_cookie('username', username)

Затем в GET я проверяю, установлен ли cookie 'username' или нет. Если он установлен, я перевожу пользователя на приборную панель. В противном случае я перевожу его на страницу входа в систему.

3- В представлении /logout я удаляю cookie 'username' следующим образом:

response.delete_cookie('username')

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

Чего я ожидаю

Я хочу, чтобы если пользователь не нажал кнопку выхода из системы вручную, и прошло время 1 час, то он должен попасть на страницу входа после обновления или автоматически. Я попробовал написать подобное промежуточное ПО, посмотрев другой ответ на stackoverflow:

from django.contrib.auth import logout
import datetime

# from core.settings import SESSION_IDLE_TIMEOUT
from django.conf import settings
# import codesettings


class SessionIdleTimeout(object):
    """Middle ware to ensure user gets logged out after defined period if inactvity."""

    def __init__(self, get_response):
        print("in init middleware")
        self.get_response = get_response

    def __call__(self, request):

        if request.user.is_authenticated:
            current_datetime = datetime.datetime.now()

            if 'last_active_time' in request.session:
                idle_period = (current_datetime -
                               request.session['last_active_time']).seconds
                if idle_period > settings.SESSION_IDLE_TIMEOUT:
                    logout(request)
                    response = redirect('users/login.html')
                    response.delete_cookie('username')
                    return response
            request.session['last_active_time'] = current_datetime

        response = self.get_response(request)
        return response

Но я думаю, что пользователь не достигает

if idle_period > settings.SESSION_IDLE_TIMEOUT:

условие, потому что он все еще застрял на приборной панели. Для написания промежуточного ПО я использовал следующие настройки:

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
SESSION_COOKIE_AGE = 60*60
SESSION_IDLE_TIMEOUT = 60*60

Любая помощь по реализации автоматического входа и автоматического выхода (после 1 часа бездействия) будет принята с благодарностью.

Вернуться на верх