Як перевірити, чи користувач увійшов (як правильно користуватися user.is_authentication)?


250

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

request.user.is_authenticated

незважаючи на те, що користувач увійшов у систему, він повертається просто:

>

Я можу робити інші запити (з першого розділу в URL-адресі вище), наприклад:

request.user.is_active

що повертає успішну відповідь.


1
is_authentication (як всередині, так і зовні шаблони) завжди повертає значення True - незалежно від того, дійсно користувач увійшов чи ні. Істинно визначити, чи користувач увійшов у систему, єдиним рішенням, як видається, є порівняння його дати та часу останнього часу з часом очікування
Tony Suffolk 66,

Відповіді:


509

Оновлення для Django 1.10+ : is_authenticatedтепер атрибут у Django 1.10. Цей метод все ще існує для зворотної сумісності, але буде видалений у Django 2.0.

Для Джанго 1.9 та старших :

is_authenticatedє функцією. Ви повинні так називати

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

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

{% if user.is_authenticated %}

Однак у коді Python це дійсно метод у Userкласі.


ой добре .. дякую за інформацію, яка має сенс тоді, чому вона не працювала, якщо я щось не пропустив, насправді не зрозуміло про це в документації на джанго
Рік,

2
@Rick: Я прошу розібратися з вами. is_authentication () - другий елемент, перелічений у розділі методів моделей класів. Те , що може ввести в оману в тому , що мова шаблонів робить НЕ використовуйте буксирування () 'с, так що ви можете побачити що - щось на зразок {% , якщо user.is_authenticated%}. Ви отримаєте помилку, якщо помістите () в (див. Docs.djangoproject.com/en/dev/topics/auth/… та docs.djangoproject.com/en/1.2/topics/templates/#variables )
Пітер Роуелл

2
@Peter, добре, що вони не використовують () у прикладах, я розумію, що я впевнений, що вони десь пояснили, що це метод і як це зробити правильно. Це просто добре, коли API використовує в ньому синтаксис реального життя, щоб він мене може швидко взяти хтось новий в проекті, наприклад, Джанго, просто домашній вихованець, я думаю, як я схильний перебирати речі, але я усвідомлюю, що повинен був би придивитися ближче, дякую за допомогу
Рік

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_authentication (як всередині, так і зовнішні шаблони) завжди повертає True для реального користувача (та False для анонімного користувача) - незалежно від того, користувач насправді увійшов чи ні.
Тоні Суффолк 66,

Це нормально, оскільки цей метод використовується на request.user. Незалежно від того, чи користувач увійшов або не тільки має значення в контексті запиту, наприклад, сеанс браузера.
Марк Чакерян

Припустимо, що програма правильно реєструє користувачів - я бачив деяких, які цього не роблять.
Тоні Суффолк 66,

22

Наступний блок повинен працювати:

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

2
але is_authentication (як всередині, так і зовнішні шаблони) завжди повертає значення True - незалежно від того, чи дійсно користувач увійшов чи ні.
Тоні Суффолк 66,

У документі сказано: Атрибут лише для читання, який завжди є True (на відміну від AnonymousUser.is_authentication, який завжди помилковий). Це спосіб визначити, чи був аутентифікований користувач. Це не означає жодних дозволів і не перевіряє, чи користувач активний чи має дійсний сеанс. Незважаючи на те, що зазвичай ви перевіряєте цей атрибут на request.user, щоб дізнатись, чи був він заселений програмою AuthenticationMiddleware (що представляє користувача, який зараз увійшов у систему), ви повинні знати, що цей атрибут відповідає дійсності для будь-якого користувача.
Сопан

Отож, якщо ви хочете відобразити користувачів, які не мають автентифікації, як "Ласкаво просимо", а автентифікувати користувачів як "Ласкаво просимо. }} !!! </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):

але is_authentication (як всередині, так і зовнішні шаблони) завжди повертає значення True - незалежно від того, чи дійсно користувач увійшов чи ні.
Тоні Суффолк 66,

краще, request.user.is_authenticatedякщо ви знаєте, що ваша програма завжди виходитиме з користувача
Tony Suffolk 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_authentication () видалено у версіях Django 2.0+.


7
request.user.is_authenticatedдіє досі. Ви посилаєтесь на документацію django-rest-
frame
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.