Как проверить, зарегистрирован ли пользователь (как правильно использовать user.is_authenticated)?
Я просматриваю этот сайт, но просто не могу понять, как это сделать, поскольку он не работает. Мне нужно проверить, зарегистрирован ли текущий пользователь сайта (аутентифицирован), и я пытаюсь:
request.user.is_authenticated
несмотря на то, что пользователь вошел в систему, он возвращает только:
>
Я могу выполнять другие запросы (из первого раздела в url выше), например:
request.user.is_active
который возвращает успешный ответ.
Ответы
Ответ 1
is_authenticated
- это функция. Вы должны называть его как
if request.user.is_authenticated():
# do something if the user is authenticated
Как отметил Питер Роуэлл, что может вас отключить, так это то, что на языке шаблонов Django по умолчанию вы не привязываетесь к скобкам для вызова функций. Таким образом, вы можете увидеть что-то вроде этого в коде шаблона:
{% if user.is_authenticated %}
Однако в коде Python это действительно метод в классе User
.
Изменить для Django 1.10: is_authenticated
теперь является атрибутом в Django 1.10. Этот метод все еще существует для обратной совместимости, но будет удален в Django 2.0.
Ответ 2
Следующий блок должен работать:
{% if user.is_authenticated %}
<p>Welcome {{ user.username }} !!!</p>
{% endif %}
Ответ 3
Django 1.10 +
Используйте атрибут, а не метод:
if request.user.is_authenticated: # <- no parentheses any more!
# do something if the user is authenticated
Использование метода с тем же именем устарело в Django 2.0 и больше не упоминается в документации Django.
Обратите внимание, что для Django 1.10 и 1.11 значение свойства является CallableBool
, а не логическим, что может вызвать некоторые странные ошибки.
Например, у меня было представление, которое вернуло JSON
return HttpResponse(json.dumps({
"is_authenticated": request.user.is_authenticated()
}), content_type='application/json')
который после обновления свойства request.user.is_authenticated
выбрасывал исключение TypeError: Object of type 'CallableBool' is not JSON serializable
. Решением было использование JsonResponse, которое могло бы корректно обрабатывать объект CallableBool при сериализации:
return JsonResponse({
"is_authenticated": request.user.is_authenticated
})