Пользователь Django is_authenticated vs. is_active

Прочитав документацию, я все еще не до конца понимаю разницу между этими двумя методами User: is_authenticated и is_active.

Оба возвращают булево значение. В то время как is_authenticated доступен только для чтения (и вы получите ошибку, если попытаетесь установить его), is_active может быть изменен, и, например, вы можете установить его в False вместо удаления аккаунта.

Выполнение этих команд приведет к деактивации пользователя:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(pk=10) # get an arbitrary user   
>>> u.is_active
True
>>> u.is_active = False # change the value
>>> u.save() # save to make effective
>>> u.is_authenticated
True

Теперь этот пользователь все еще аутентифицирован, но больше не может войти в систему.

В представлении входа в систему используется authenticate(). Что на самом деле происходит, что вход для деактивированного пользователя не удается?

if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password1']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)

Для проверки учетных данных используется authenticate(), который возвращает объект User в случае успеха или None в противном случае. Я предполагаю, что он возвращает None в случае, если предоставленные учетные данные верны, но is_active - False.

Кроме того, блок Jinja {% if user.is_authenticated %} оценивается как false, если is_active является False, что сбивает с толку, когда я думаю, что user.is_authenticated является True и доступен только для чтения.

Представление регистрации

выглядит очень похоже на представление входа в систему - за исключением сохранения формы. На мой взгляд, использование authenticate() выглядит идентично случаю входа в систему. Что я упускаю?

if request.method == "POST":
    form = UserCreationForm(request.POST)
    if form.is_valid():
        form.save()
        username = form.cleaned_data['username']
        password = form.cleaned_data['password1']
        user = authenticate(request, username=username, password=password)
        login(request, user)

TLDR: Пересказ вопросов:

  1. что происходит с проверкой authenticate() в представлении входа для деактивированного пользователя и почему {% user.is_authenticated %} ложно?
  2. какова разница для authenticate() между представлениями входа и регистрации?
  3. эквивалентно ли is_authenticated сказать, что пользователь существует?

is_active - это атрибут учетных записей пользователей, который можно включать и выключать. Вы можете сделать это в интерфейсе администратора или программно. Вход в систему разрешен только активным пользователям. Т.е. вы можете использовать флаг is_active, чтобы запретить пользователю входить в систему без необходимости менять пароль, удалять аккаунт или делать что-то еще более радикальное.

is_authenticated - это атрибут конкретного используемого пользовательского класса. Если у вас есть реальные объекты User, их атрибут is_authenticated всегда true; это статически установленный атрибут класса User.

Атрибут is_authenticated актуален только для пользовательских объектов по запросам:

def view(request):
    if request.user.is_authenticated:
        ...

Если бы пользователь запроса был не аутентифицирован, request.user был бы не объектом User, а объектом AnonymousUser, атрибутом is_authenticated которого всегда является False. Идея здесь в том, что request.user всегда существует, независимо от того, аутентифицирован пользователь в данный момент или нет. Это означает, что вам не нужно писать код типа if request.user is not None and request.user..... Вы всегда можете ожидать существования объекта user, и вы можете различать аутентифицированных и неаутентифицированных (анонимных) пользователей с помощью атрибута is_authenticated.

Вернуться на верх