¿Cómo verifico si este usuario es anónimo o realmente un usuario en mi sistema?

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

En Django, ¿cómo sé si es un usuario real o no? Lo intenté:

if the_user: pero "AnonymousUser" está ahí incluso si nadie inicia sesión. Por lo tanto, siempre devuelve verdadero y esto no funciona.

TIMEX
fuente

Respuestas:

136

Puedes comprobar si request.user.is_anonymousvuelve True.

Daniel DiPaolo
fuente
20
Tenga en cuenta que views.pydebe usar request.user.is_anonymous()ya que es una función, mientras que en las plantillas debe usar{{user.is_anonymous}}
amigcamel
11
Parece que en Django 1.9 es más bien is_authenticated(): consulte docs.djangoproject.com/en/1.9/topics/auth/default/…
Paolo Stefan
11
de Django 1.10, is_anonymous ya no es un método (solo una propiedad)
maxbellec
2
Debo estar de acuerdo con Paolo Stefan, el método que desea utilizar es is_authenticated(). Véase también thegarywilson.com/blog/2006/is_authenticated-vs-is_anonymous
Al Sweigart
3
La recomendación actual es usar request.user.is_authenticated, que es un atributo en Django 1.10+, el mismo que is_anonymousahora - vea docs.djangoproject.com/en/dev/ref/contrib/auth/… . Tenga en cuenta que si también está utilizando Django Guardian, estos atributos no harán lo que cree que harán; consulte django-guardian.readthedocs.io/en/stable/configuration.html
rhunwicks
18

Una alternativa a

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

es probando para ver cuál es la identificación del objeto de usuario:

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

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

leifos
fuente
4
parece una mala idea. user.is_anonymous () seguirá funcionando en las nuevas versiones, user.id podría no, dependiendo de futuras implementaciones
maxbellec
Además, tenga en cuenta que si está utilizando Django Guardian, el usuario anónimo también tendrá una identificación; consulte django-guardian.readthedocs.io/en/stable/… .
rhunwicks
Y la recomendación actual según docs.djangoproject.com/en/dev/ref/contrib/auth/… es usar User.is_authenticated
rhunwicks
Desafortunadamente, esto no funciona. Fue lo primero que intenté. Parece que el usuario "anónimo" aparece cuando se usa user == None (y otras variaciones).
Harlin
4

Sé que estoy investigando un poco aquí, pero una búsqueda en Google me llevó a esta página.

Si su view def requiere que el usuario haya iniciado sesión, puede implementar el decorador @login_required:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
Karl MW
fuente
Esto no funcionará en la vista de "inicio de sesión" de valores sin alguna personalización.
Harlin
0

Tuve un problema similar, excepto que esto estaba en una página a la que se envió login_redirect_url. Tuve que poner la plantilla:

{% if user.is_authenticated %}
    Welcome Back, {{ username }}
{% endif %}
Harlin
fuente