Я всегда получаю 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 с базовыми стилями, использую только имя пользователя для приветствия.

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