Как перенаправить меня обратно на страницу входа в систему после 10 секунд бездействия с помощью django?
В моем settings.py я указал это и sessionId действительно истек, но он перенаправляет меня на некоторые случайные ссылки, которые я никогда не указывал вообще, вместо этого возвращается на страницу входа и показывает какую-то ошибку, я хочу, чтобы он перенаправлял обратно на страницу входа после 10 секунд бездействия, как мне это сделать?
Мой settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django_session_timeout.middleware.SessionTimeoutMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
SESSION_EXPIRE_SECONDS = 10
SESSION_EXPIRE_AFTER_LAST_ACTIVITY = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
Мой views.py
def login_view(request):
form = LoginForm(request.POST or None)
msg = None
if request.method == 'POST':
if form.is_valid():
username = form.cleaned_data.get('username') # retrieve the username
password = form.cleaned_data.get('password') # retrieve the password
user = authenticate(username=username, password=password) # authenticate user
if user is not None and user.is_admin: # authenticated if user is an admin
login(request, user)
return redirect('adminpage') # redirect the user to the admin page
elif user is not None and user.is_customer: # authenticated if user is a customer service
login(request, user)
return redirect('customer') # redirect the user to the customer service page
elif user is not None and user.is_logistic: # # authenticated if user is a logistic
login(request, user)
return redirect('logistic') # redirect the user to the logistic page
else:
msg = 'invalid credentials'
else:
msg = 'error validating form'
return render(request, 'login.html', {'form': form, 'msg': msg})
def admin(request):
return render(request, 'admin.html')
Мой urls.py
urlpatterns = [
path('', views.index, name='index'),
path('login/', views.login_view, name='login_view'),
path('register/', views.register, name='register'),
path('adminpage/', views.admin, name='adminpage'),
path('customer/', views.customer, name='customer'),
path('logistic/', views.logistic, name='logistic'),
path('forget/', views.forget, name='forget'),
path('newblock/', views.newblock, name='newblock'),
path('quote/', views.quote, name='quote'),
path('profile/', views.profile, name='profile'),
path('adminprofile/', views.adminprofile, name='adminprofile'),
]
Вот сообщение об ошибке, которое он показывает мне после истечения сессии:
Проблема заключается в вашем логин-урле :
Django пытается перенаправить на http://localhost:8000/accounts/login/
, но этот url не определен ни в одном urls.py
файле.
Добавьте LOGOUT_REDIRECT_URL = reverse_lazy('login_view')
в файл settings.py
. (не забудьте from django.urls import reverse_lazy
).
'django_session_timeout.middleware.SessionTimeoutMiddleware' вызывает django.contrib.auth.views.redirect_to_login
, если в настройках не указано SESSION_TIMEOUT_REDIRECT
значение. Детали
redirect_to_login
внутренне использует settings.LOGIN_URL
значение https://docs.djangoproject.com/en/3.2/ref/settings/#login-url
Похоже, что у вас есть два варианта: установить SESSION_TIMEOUT_REDIRECT или изменить значение LOGIN_URL в настройках. Я бы рекомендовал изменить второе.