Як мені перевірити, чи є цей користувач анонімним чи насправді користується моєю системою?


84
def index(request):
    the_user = request.user

У Django, як я можу дізнатися, справжній користувач це чи ні? Я намагався:

if the_user: але "AnonymousUser" є, навіть якщо ніхто не входить у систему. Отже, це завжди повертає true, і це не працює.

Відповіді:


140

Ви можете перевірити, чи request.user.is_anonymousповертається True.


21
Майте на увазі, що в views.pyвам слід використовувати, request.user.is_anonymous()оскільки це функція, тоді як у шаблонах ви повинні використовувати{{user.is_anonymous}}
amigcamel

12
Схоже, у Django 1.9 це скоріше is_authenticated(): будь ласка, див. Docs.djangoproject.com/en/1.9/topics/auth/default/…
Паоло Стефан

13
з Django 1.10, is_anonymous більше не є методом (просто властивість)
maxbellec

2
Я повинен погодитися з Паоло Стефаном, метод, яким ви хочете скористатися is_authenticated(). Дивіться також thegarywilson.com/blog/2006/is_authenticated-vs-is_anonymous
Аль Свейгарт

3
Поточна рекомендація полягає у використанні request.user.is_authenticated, що є атрибутом у Django 1.10+, таким самим, як is_anonymousі зараз - див. Docs.djangoproject.com/en/dev/ref/contrib/auth/… . Зверніть увагу, що якщо ви також використовуєте Django Guardian, то ці атрибути не будуть робити те, що ви думаєте - див. Django-guardian.readthedocs.io/en/stable/configuration.html
rhunwicks

18

Альтернатива

if user.is_anonymous():
    # user is anon user

шляхом тестування, щоб побачити, що таке ідентифікатор об’єкта користувача:

if user.id == None:
    # user is anon user
else:
    # user is a real user

див. https://docs.djangoproject.com/en/dev/ref/contrib/auth/#anonymous-users


4
здається поганою ідеєю. user.is_anonymous () продовжуватиме працювати в нових версіях, user.id може не працювати, залежно від майбутніх реалізацій
maxbellec

Також пам’ятайте, що якщо ви використовуєте Django Guardian, тоді анонімний користувач також матиме ідентифікатор - див. Django-guardian.readthedocs.io/en/stable/… .
rhunwicks

І поточна рекомендація згідно docs.djangoproject.com/en/dev/ref/contrib/auth/… полягає у використанні User.is_authenticated
rhunwicks

На жаль, це не працює. Це було перше, що я спробував. Здається, "анонімний" користувач з'являється, коли використовує user == None (та інші варіанти).
Харлін

4

Я знаю, що трохи роблю тут могилу, але пошук у Google привів мене на цю сторінку.

Якщо ваш перегляд def вимагає, щоб користувач ввійшов у систему, ви можете застосувати декоратор @login_required:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):

Це не працюватиме в режимі перегляду акцій "Логін" без певної настройки.
Харлін,

0

У мене була подібна проблема, за винятком того, що це було на сторінці, на яку було надіслано login_redirect_url. Мені довелося помістити в шаблон:

{% if user.is_authenticated %}
    Welcome Back, {{ username }}
{% endif %}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.