Неправильное перенаправление на страницу входа из профиля и ссылки выхода из системы после входа пользователя

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

Ссылка на профиль: Служит для перехода на страницу профиля пользователя, если он вошел в систему.

Ссылка выхода: Должна вывести пользователя из системы и перенаправить на домашнюю страницу.

Текущая настройка:

Шаблоны (base.html):

{% if logged_in %}
    <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
        {{ customer_name }}
    </a>
    <ul class="dropdown-menu" aria-labelledby="userDropdown">
        <li><a class="dropdown-item" href="{% url 'profile' %}?email={{ customer_email }}">Profile</a></li>
        <li><a class="dropdown-item" href="{% url 'logout' %}">Logout</a></li>
    </ul>
{% else %}
    <a class="nav-link" href="{% url 'login' %}">Login</a>
{% endif %}

Просмотры:

from django.shortcuts import redirect, render
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import costumer

@login_required
def profile_view(request):
    email = request.GET.get('email')
    if email:
        try:
            user = costumer.objects.get(email=email)
            if user.id == request.session.get('customer_id'):
                return render(request, 'profile.html', {'user': user})
            else:
                return redirect('index')
        except costumer.DoesNotExist:
            return redirect('index')
    else:
        return redirect('index')

def logout_view(request):
    request.session.flush()
    auth_logout(request)
    return redirect('index')

def login_view(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')

        try:
            customer = costumer.objects.get(email=email)
            if customer.check_password(password):
                request.session['customer_id'] = customer.id
                request.session['logged_in'] = True
                request.session['customer_name'] = f"{customer.first_name} {customer.last_name}"
                request.session['customer_email'] = customer.email
                messages.success(request, "Logged in!!")
                return redirect('index')
            else:
                messages.error(request, 'Incorrect password')
        except costumer.DoesNotExist:
            messages.error(request, 'Email not found')

    return render(request, 'login.html')

URLs:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    path('profile/', views.profile_view, name='profile'),
]

Управление сеансами:

  • Переменные сессии устанавливаются в login_view и очищаются в logout_view.

Предпринятые шаги по отладке:

  • Отобразите данные сеанса в различных представлениях, чтобы убедиться, что параметры customer_id и customer_name установлены правильно.
  • Заметили, что нажатие на ссылки профиля или выхода из системы всегда перенаправляет на страницу входа.

Выпуск: Не могли бы вы помочь мне выяснить, почему эти ссылки перенаправляют на страницу входа вместо того, чтобы показать профиль или выйти из системы должным образом? В частности, мне нужна помощь в проверке обработки сессии и обеспечении правильного перенаправления.

Ваше представление входа в систему неправильно регистрирует пользователя. Предполагается, что представление входа в систему должно вызывать функцию login(), но ваше представление не вызывает эту функцию. Поскольку представление профиля украшено @login_required, вы не сможете получить доступ к представлению, пока не войдете в систему.

Похоже, что вы реализовали собственную логику для регистрации пользователя, но она не будет работать со встроенной системой аутентификации Django, такой как декоратор @login_required.

Вы должны изменить login_view, чтобы правильно вызывать функцию login, как показано в примерах документации:

def my_view(request):
    username = request.POST["username"]
    password = request.POST["password"]
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user) # <--- You are missing this call!
        # Redirect to a success page.
        ...
    else:
        # Return an 'invalid login' error message.
        ...
Вернуться на верх