Я всегда получаю false для функции is_authenticate() в Django
Я пытаюсь выполнить аутентификацию по электронной почте для пользователей, которые успешно вошли в систему, и перенаправить их на соответствующие домашние страницы в зависимости от их роли. Вход в систему работает, я получаю otp по почте и otp-аутентификация также работает нормально, и пользователь перенаправляется на нужную домашнюю страницу.
Однако я понял, что можно напрямую перейти на домашнюю страницу по url в браузере, даже если пользователь не вошел в систему. Я пробовал использовать декоратор @login_required
перед просмотром главной страницы, но по некоторым причинам он не работал и перенаправлял меня на страницу входа, даже если пользователь уже вошел в систему, поэтому я попробовал следующий способ, но теперь is_authenticated
всегда выдает false.
def reader_home(request):
if request.user.is_authenticated:
return render(request, 'reader_home.html', {'username': request.session.get('username')})
else:
messages.info(request, 'User is not yet authenticated!')
return redirect('homepage')
def writer_home(request):
print(f'request.user:{request.user}')
if request.user.is_authenticated:
return render(request, 'writer_home.html', {'username':request.session.get('username')})
else:
messages.info(request, 'User is not yet authenticated!')
return redirect('homepage')
Ниже представлены login_view и otp-verification view:
login_view:
def login_view(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
role = request.POST.get('role')
try:
user = UserCredentials.objects.get(username=username, role=role)
except UserCredentials.DoesNotExist:
user = None
if user:
if user.check_password(password):
login(request, user)
otp_secret = pyotp.random_base32()
otp_secret_bytes = base64.b32encode(otp_secret.encode())
totp = TOTP(secret=otp_secret_bytes,period=180)
otp = totp.generate()
request.session['otp_secret'] = otp
request.session['username'] = username
# Send email with OTP
subject = 'Login OTP'
html_message = render_to_string('otp_email.html', {'otp': otp})
plain_message = strip_tags(html_message)
from_email = 'microtales00@gmail.com'
to_email = [user.email]
send_mail(subject, plain_message, from_email, to_email, html_message=html_message)
return redirect('otp_verification',role,username)
else:
messages.error(request, 'Invalid Password!')
return render(request, 'login.html')
else:
messages.error(request, 'Invalid UserName or Role!')
return render(request, 'login.html')
return render(request, 'login.html')`
otp_verification:
def otp_verification(request, role,username):
if request.method == 'POST':
entered_otp = request.POST.get('otp') #string type
otp_secret = request.session.get('otp_secret')# int type
print(f'entered_otp: {entered_otp}')
print(f'otp_secret:{otp_secret}')
if not otp_secret:
return HttpResponse('Invalid request')
if str(entered_otp) == str(otp_secret):
if role == 'writer':
return redirect('writer_home')
elif role == 'reader':
return redirect('reader_home',username)
else:
messages.error(request, 'Unknown Role!')
return render(request, 'login.html')
else:
# OTP verification failed
messages.error(request, 'Invalid OTP. Please try again.')
return render(request, 'otp_verification.html')
return render(request, 'otp_verification.html')
У меня есть следующие конфигурации в settings.py
:
INSTALLED_APPS = [
'tales.apps.TalesConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_otp',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
и вот приложение urls.py
:
from django.contrib import admin
from django.urls import path,include
from tales import views
urlpatterns = [
path('', views.homepage, name='homepage'),
path('register/', views.register, name='register'),
path('logout/', views.logout_view, name='logout'),
path('login/', views.login_view, name='login'),
path('otp-verification/<str:role>/<str:username>/', views.otp_verification, name='otp_verification'),
path('reader_home/<str:username>/', views.reader_home, name='reader_home'),
path('writer_home/', views.writer_home, name='writer_home'),
]
У меня не так много шаблонов, только базовый html с базовыми стилями, использую только имя пользователя для приветствия.