Как проверить, вошел ли пользователь в систему (как правильно использовать user.is_authenticated)?

250

Я просматриваю этот сайт, но просто не могу понять, как это сделать, так как он не работает. Мне нужно проверить, вошел ли текущий пользователь сайта в систему (аутентифицирован) и пытаюсь:

request.user.is_authenticated

несмотря на то, что пользователь вошел в систему, он возвращает только:

>

Я могу сделать другие запросы (из первого раздела в URL выше), такие как:

request.user.is_active

который возвращает успешный ответ.

стог
источник
1
is_authenticated (как внутри, так и вне шаблонов) всегда возвращает True - независимо от того, вошел ли пользователь в систему или нет. Чтобы точно определить, вошел ли пользователь в систему, кажется, что единственное решение состоит в том, чтобы сравнить его дату / время last_seen с тайм-аутом
Tony Suffolk 66

Ответы:

509

Обновление для Django 1.10+ : is_authenticatedтеперь это атрибут в Django 1.10. Метод все еще существует для обратной совместимости, но будет удален в Django 2.0.

Для Django 1.9 и старше :

is_authenticatedэто функция. Вы должны назвать это как

if request.user.is_authenticated():
    # do something if the user is authenticated

Как отметил Питер Роуэлл, вас может сбить с толку то, что в стандартном языке шаблонов Django вы не привязываете скобки для вызова функций. Таким образом, вы могли видеть что-то подобное в коде шаблона:

{% if user.is_authenticated %}

Однако в коде Python это действительно метод в Userклассе.

Брайан Нил
источник
о, хорошо .. спасибо за информацию, это имеет смысл тогда, почему это не сработало, если я что-то пропустил, это действительно не ясно об этом в документации django
Рик
2
@Rick: Я позволю себе не согласиться с вами. is_authenticated () является вторым элементом, перечисленным в разделе методов класса models.User. То , что может ввести в заблуждение в том , что язык шаблонов делает не используйте буксировку () 'с, так что вы можете увидеть что - то вроде {% , если user.is_authenticated%}. Вы получите ошибку, если вставите () в. (См. Docs.djangoproject.com/en/dev/topics/auth/… и docs.djangoproject.com/en/1.2/topics/templates/#variables )
Питер Роуэлл
2
@Peter, ну, они не используют () в примерах, я понимаю, что я уверен, что они где-то объяснили, что это метод и как это сделать правильно, просто приятно, когда API использует в нем реальный синтаксис, чтобы он может быть быстро принят кем-то новым для такого проекта, как Django, просто любопытство, я думаю, поскольку я склонен пробираться сквозь вещи, но я понимаю, что должен был присмотреться, спасибо за помощь
Рик
4
@Rick: Я полностью согласен с вами по поводу синтаксиса реальной жизни. Я слышал (что я считаю) слабые причины, по которым они не используют «настоящий» язык программирования для системы шаблонов, но это то, что они сделали. Вы можете использовать Jinja2 ( jinja.pocoo.org/2 ), и он предоставит вам полные возможности Python, но, поскольку подавляющее большинство сторонних приложений используют систему Django, их часто сложно смешать. Посмотрите на ExprTag ( djangosnippets.org/snippets/9 ), чтобы узнать, как получить выражения внутри шаблонов Django. Оно работает.
Питер Роуэлл
3
@ Рик документация говорит разные вещи для разных версий. Похоже, для 1.10 это уже не метод
yairchu
32

Джанго 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 значением свойства является a, 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
})
Марк Чакериан
источник
1
но is_authenticated (как внутри, так и снаружи шаблонов) всегда возвращает True для реального пользователя (и False для анонимного пользователя) - независимо от того, вошел ли пользователь в систему или нет.
Тони Саффолк 66
Это нормально, потому что этот метод используется request.user. То, вошел ли пользователь в систему или нет, имеет значение только в контексте запроса, например, в сеансе браузера.
Марк Чакериан
Предполагая, что приложение корректно завершает работу пользователей - я видел некоторых, которые этого не делают.
Тони Саффолк 66
22

Следующий блок должен работать:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
Sopan
источник
2
но is_authenticated (как внутри, так и вне шаблонов) всегда возвращает True - независимо от того, вошел ли пользователь в систему или нет.
Тони Саффолк 66
Документ гласит: Атрибут только для чтения, который всегда True (в отличие от AnonymousUser.is_authenticated, который всегда False). Это способ определить, был ли пользователь аутентифицирован. Это не подразумевает никаких разрешений и не проверяет, является ли пользователь активным или имеет действительный сеанс. Несмотря на то, что обычно вы проверяете этот атрибут в request.user, чтобы узнать, был ли он заполнен AuthenticationMiddleware (представляющим пользователя, вошедшего в систему), вы должны знать, что этот атрибут равен True для любого экземпляра пользователя.
Шопан
Поэтому, если вы хотите отобразить пользователей, не прошедших проверку подлинности, как «Добро пожаловать, гость», а также проверить подлинность пользователей как «Добро пожаловать. USERNAME», тогда может работать следующий блок в шаблонах: {% if user.is_authenticated%} <p> Добро пожаловать {{user.username }} !!! </ p> {% else%} <p> Добро пожаловать, Гость !!! </ p> {% endif%}
Шопан,
7

По вашему мнению:

{% if user.is_authenticated %}
<p>{{ user }}</p>
{% endif %}

В функции контроллера добавьте декоратор:

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):
Cubiczx
источник
но is_authenticated (как внутри, так и вне шаблонов) всегда возвращает True - независимо от того, вошел ли пользователь в систему или нет.
Тони Саффолк 66
лучше для пользователя, request.user.is_authenticatedесли вы знаете, что ваше приложение будет всегда выходить из системы
Тони Суффолк 66
0

Если вы хотите проверить подлинность пользователей в вашем шаблоне, то:

{% if user.is_authenticated %}
    <p>Authenticated user</p>
{% else %}
    <!-- Do something which you want to do with unauthenticated user -->
{% endif %}
Суяш Кумар
источник
-5

Для версий Django 2.0+ используйте:

    if request.auth:
       # Only for authenticated users.

Для получения дополнительной информации посетите https://www.django-rest-framework.org/api-guide/requests/#auth

request.user.is_authenticated () был удален в версиях Django 2.0+.

Джатин Гоял
источник
7
request.user.is_authenticatedвсе еще в силе. Вы ссылаетесь на документацию django-rest-framework, а не на django
grouchoboy