Home > Software engineering >  Why the login_required decorator doesn't work?
Why the login_required decorator doesn't work?

Time:11-30

Working on a simple project using Django 3.2 and the loqin_required decorator is not working. When I close the server and re-open it again, it works the first time but not anymore. It used to work very well, but I'm not sure what I changed in the code that it doesn't work anymore.

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"),
]

Any suggestion or response would appreciate it Thanks!

CodePudding user response:

If you are logging out the user just by redirecting, you're not actually logging them out. You have to use the logout function of the authentication framework, with the logout() function, or you can use logout_then_login view from django if all you want to do is send users back to the login page.

CodePudding user response:

You must put it like this before the classes

@login_required(login_url='/login/')

read this for more

  • Related