Как решить эту проблему? Не работает оператор Login if
Это мой views.py
def user_login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user:
if user.is_active:
login(request, user)
return HttpResponseRedirect(reverse('index'))
else:
return HttpResponse("Your account is Inactive.")
else:
return HttpResponse("Invalid User Credentials Provided!!!!")
else:
return render(request, "MyTestApp/login.html", {})
А это моя страница входа в систему:
<div class="container">
<div class="jumbotron">
<h2 class="text-dark"> Login </h2>
<form method="post" action="{ url 'MyTestApp:user_login '}">
{%csrf_token%}
<label for="username"> Username </label>
<input type="text" name="username" placeholder=" Write Your UserName Here"> <br></br>
<label for="password"> Password </label>
<input type="text" name="password" placeholder=" Write Your Password Here"> <br></br>
<input type="submit" class="btn btn-dark" name="savebutton" value="login">
</form>
</div>
Когда я пытаюсь войти в систему, она работает. Если я пытаюсь войти с незарегистрированной учетной записью, то это не позволяет мне вернуться сообщение "Invalid User Credentials Provided", что хорошо. Но когда я пытаюсь войти в систему с неактивной учетной записью, все равно возвращается сообщение "Invalid User Credentials Provided". Он не возвращает сообщение "Ваша учетная запись неактивна.", которое он должен возвращать, когда я вхожу в систему с неактивной учетной записью. Кто-нибудь знает, почему это происходит? Любая помощь будет очень признательна.
Это потому, что вы используете ModelBackend Authentication, который является стандартным для Django. Этот бэкенд проверяет, может ли пользователь аутентифицироваться, проверяя, является ли пользователь активным. Ваш пользователь не активен, поэтому он не может аутентифицироваться, поэтому ваш authenticate возвращает None вместо User. Если вы хотите узнать больше об этом методе аутентификации, посмотрите django.contrib.auth.backends.ModelBackend.
Поскольку authenticate возвращает None, если учетная запись неактивна, вы не можете знать, неактивна ли учетная запись или пользователь не существует. Вы должны сами проверить статус пользователя:
from django.shortcuts import render, reverse
from django.contrib.auth import login, get_user_model
from django.http import HttpResponse, HttpResponseRedirect
def user_login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
try:
user_model = get_user_model()
user = user_model.objects.get(username=username)
if not user.is_active:
return HttpResponse("Your account is Inactive.")
if not user.check_password(password):
return HttpResponse("Invalid User Credentials Provided!!!!")
login(request, user)
return HttpResponseRedirect(reverse('index'))
except user_model.DoesNotExist:
return HttpResponse("User does not exist!!!!")
else:
return render(request, "MyTestApp/login.html", {})
По умолчанию authenticate всегда проверяет username и password со статусом is_active, поэтому authenticate всегда возвращает None, если пользователь неактивен. Вы можете сделать свой собственный CustomLoginBackend и проверить username и password и вернуть user объект, если username и password правильные, иначе возвращается None и проверить, является ли пользователь active или нет в вашем views.py
from django.contrib.auth import get_user_model
class CustomLoginBackend(object):
def authenticate(self, request, username, password):
User = get_user_model()
try:
user = User.objects.using(db_name).get(username=username)
except User.DoesNotExist:
return None
else:
if password is not None:
if user.check_password(password):
return user
return None
Тогда в ваших login представлениях.
from django.contrib.auth import authenticate, login
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render
def user_login(request):
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return HttpResponseRedirect(reverse('index'))
else:
return HttpResponse("Your account is Inactive.")
else:
return HttpResponse("Invalid User Credentials Provided!!!!")
else:
return render(request, "MyTestApp/login.html", {})
И, наконец, не забудьте добавить AUTHENTICATION_BACKENDS в свой settings.py в качестве
AUTHENTICATION_BACKENDS = ['path_to_your.CustomLoginBackend ',]