Неправильное перенаправление на страницу входа из профиля и ссылки выхода из системы после входа пользователя
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.
...