Почему декоратор login_requried не работает после выхода из учетной записи?
Работая над проектом, использующим Django 3.2, я добавил новые возможности в проект, добавив страницу входа/регистрации для пользователя. Для этого я использовал эту библиотеку, предоставленную Django from django.contrib.auth.models import User, а также в представлениях я использовал библиотеку from django.contrib.auth import authenticate, login, logout.
После успешного завершения входа/регистрации я решил провести аутентификацию домашней страницы по той причине, что пользователь без учетной записи не может иметь доступ к домашней странице. Для этого я использовал декораторы из django.contrib.auth.decorators import login_required, и я использовал их в каждом представлении, которое я хочу аутентифицировать для незарегистрированного пользователя. Чтобы лучше понять это, покажу код ниже: views.py
from django.http.response import HttpResponse
from django.shortcuts import render, redirect
from django.utils import timezone
from django.db.models import Count
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.contrib import messages
from .models import *
from .models import __str__
from .forms import CreateUserForm
# Create your views here.
@login_required(login_url='login/')
def home(request):
count_item = todo.objects.count()
all_items = todo.objects.all().order_by("created")
context = {'all_items': all_items, 'count_item':count_item}
return render(request, 'html/home.html', context)
@login_required(login_url='login/')
def add_todo(request):
current_date = timezone.now()
new_item= todo(content = request.POST["content"])
new_item.save()
return redirect('/')
@login_required(login_url='login/')
def delete_todo(request, todo_id):
item_to_delete = todo.objects.get(id=todo_id)
item_to_delete.delete()
return redirect('/')
def login_user(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
# print('USER:', user)
if user is not None:
login(request, user)
return redirect('/')
return render(request, 'html/login.html')
def logoutUser(request):
logout(request)
return redirect('login/')
def register_user(request):
form = CreateUserForm()
if request.method == 'POST':
form = CreateUserForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.save()
user = authenticate(request, username=user.username, password=request.POST.get('password1'))
print("USER:",user)
if user is not None:
login(request, user)
return redirect('/')
context = {'form':form}
return render(request, 'html/register.html', context)
urls.py
from django.urls import path
from django.views.generic.base import RedirectView
from . import views
app_name = 'todo'
urlpatterns = [
path('', views.home, name="home"),
path('add_todo/', views.add_todo),
path('delete_todo/<int:todo_id>/', views.delete_todo),
path('login/', views.login_user, name='login'),
path('logout/', views.logoutUser, name='logout'),
path('register/', views.register_user, name="register"),
]
forms.py
from django.forms import ModelForm, fields
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
class CreateUserForm(UserCreationForm):
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'email', 'password1', 'password2']
Проблема, с которой я сталкиваюсь, заключается в том, что при первом открытии страницы на localhost аутентификация работает, я не могу получить доступ к главной странице без регистрации или входа на страницу, но после того, как я войду зарегистрированным пользователем и выйду, аутентификация не работает, я могу получить доступ к главной странице после выхода.
Я не уверен, почему он не работает после входа в систему.
Буду признателен за любой ответ Спасибо!
Вы можете определить e выделенный параметр в settings.py, для вашего проекта это будет :
LOGIN_URL = '/todo/login/'
Затем в файле views.py просто используйте @login_required
Если ваш путь изменится по какой-либо причине, вам придется изменить его только один раз.
def logoutUser(request):
logout(request)
render(request, 'html/login.html')
попробуйте отправить запрос клиенту.