簡體   English   中英

@login_required 裝飾在 Django 中不起作用(用戶未通過身份驗證?)

[英]The @login_required decoration is not working in Django (user not authenticated?)

我正在嘗試設置登錄頁面,並且正在嘗試使用@login_required裝飾。 但是,每當我嘗試使用有效憑據登錄時,我都會被重定向到“登錄”頁面(設置為重定向未經身份驗證的用戶)。 我不確定問題出在 @login_required 裝飾中,還是 login() 函數未對用戶進行身份驗證。

這是我的注冊表單代碼:

class RegisterForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    confirm_password = forms.CharField(widget=forms.PasswordInput())
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'username', 'email', 'password']

views.py 中登錄功能的代碼:

def login_user(request):
if request.method =="GET":
    return render(request, "main/login.html", {})
else:
    username = escape(request.POST['userfield'])
    password = escape(request.POST['passfield'])
    
    try:
        user = User.objects.get(username=username)
    except:
        user = None
    
    if user is None:

        try:
            user = User.objects.get(email=username)
        except:
            user = None

            if user is None:
                messages.info(request, "*Sorry, that username or email does not exist")
                return redirect('login')
    
    pword = user.password

    if check_password(password, pword):
        login(request, user)
        return redirect('homepage')
        
    else:
        messages.info(request, '*Sorry, that was an incorrect password')
        return redirect('login')

我在models.py中的用戶模型:

class User(models.Model):
   first_name = models.CharField(max_length=100)
   last_name = models.CharField(max_length=100)
   username = models.CharField(max_length=100)
   email = models.EmailField(unique=True)
   password = models.CharField(max_length=100)
   admin = models.BooleanField(default=False)
   last_login = models.DateTimeField(null=True, blank=True)

以及我在登錄后訪問“主頁”的功能:

@login_required(redirect_field_name='login')
def homepage(request):
   return render(request, "main/homepage.html", {})

您需要在登錄前正確驗證用戶身份。

from django.contrib.auth import authenticate, login
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
    login(request, user)

文檔中的更多信息

當您制作自定義用戶模型時,您應該始終使用AbstractBaseUser

Note:將模型命名為相同也不是一個好習慣,django 已經在django.contrib.auth中有User模型,因此請更改其名稱。

因此,您尚未指定自定義用戶模型,因此您不應該進行身份驗證,因為默認身份驗證模型是User ,位於django.contrib.auth 因此,當您通過python manage.py createsuperuser創建超級用戶然后進行身份驗證時,使用當前代碼,這樣它就可以工作了。

您應該使用@login_required(login_url='login')而不是@login_required(redirect_field_name='login')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM