[英]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.