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 часа бездействия) будет принята с благодарностью.