¿Cómo verificar si un usuario ha iniciado sesión (cómo usar user.is_authenticated)?

250

Estoy revisando este sitio web, pero parece que no puedo entender cómo hacerlo, ya que no funciona. Necesito verificar si el usuario actual del sitio está conectado (autenticado) y estoy intentando:

request.user.is_authenticated

a pesar de estar seguro de que el usuario ha iniciado sesión, solo devuelve:

>

Puedo hacer otras solicitudes (desde la primera sección en la URL anterior), como:

request.user.is_active

que devuelve una respuesta exitosa.

Almiar
fuente
1
is_authenticated (plantillas internas y externas) siempre devuelve True, independientemente de si el usuario ha iniciado sesión o no. Para identificar verdaderamente si un usuario ha iniciado sesión, la única solución parece ser comparar su última fecha / hora vista con el tiempo de espera
Tony Suffolk 66

Respuestas:

509

Actualización para Django 1.10+ : is_authenticatedahora es un atributo en Django 1.10. El método todavía existe para la compatibilidad con versiones anteriores, pero se eliminará en Django 2.0.

Para Django 1.9 y anteriores :

is_authenticatedEs una función. Deberías llamarlo así

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

Como señaló Peter Rowell, lo que puede estar tropezando es que en el lenguaje de plantilla predeterminado de Django, no agrega paréntesis para llamar a las funciones. Entonces puede haber visto algo como esto en el código de la plantilla:

{% if user.is_authenticated %}

Sin embargo, en el código Python, de hecho es un método en la Userclase.

Brian Neal
fuente
oh ok ... gracias por la información, eso tiene sentido entonces por qué no estaba funcionando, a menos que me haya perdido algo, realmente no está claro sobre esto en la documentación de django
Rick
2
@ Rick: Ruego diferir contigo. is_authenticated () es el segundo elemento listado en la sección de métodos de los modelos de clase. Usuario. Lo que puede ser confuso es que el lenguaje de la plantilla no no utilizar la salida () 's, por lo que podría ver algo como {% if%} user.is_authenticated. Obtendrá un error si coloca los () 's. (Consulte docs.djangoproject.com/en/dev/topics/auth/… y docs.djangoproject.com/en/1.2/topics/templates/#variables )
Peter Rowell el
2
@Peter, bueno, no usan () en los ejemplos, me doy cuenta de que estoy seguro de que explicaron en alguna parte que es un método y cómo hacerlo correctamente, es simplemente agradable cuando una API usa la sintaxis de la vida real para que alguien nuevo en un proyecto como Django puede asimilarlo rápidamente, supongo que solo me molesta, ya que tiendo a hojear las cosas, pero me doy cuenta de que debería haber mirado más de cerca, gracias por la ayuda
Rick
44
@ Rick: Estoy completamente de acuerdo con usted sobre la sintaxis de la vida real. He escuchado las (lamentables) razones que tienen para no usar un lenguaje de programación "real" para el sistema de plantillas, pero eso es lo que hicieron. Puede optar por usar Jinja2 ( jinja.pocoo.org/2 ) y le dará todas las capacidades de Python, pero dado que la gran mayoría de las aplicaciones de terceros usan el sistema Django, a menudo es difícil mezclarlas. Mire ExprTag ( djangosnippets.org/snippets/9 ) para obtener una forma de obtener expresiones dentro de las plantillas de Django. Funciona.
Peter Rowell
3
@Rick la documentación dice cosas diferentes para diferentes versiones. Parece que para 1.10 ya no es un método
yairchu
32

Django 1.10+

Use un atributo, no un método:

if request.user.is_authenticated: # <-  no parentheses any more!
    # do something if the user is authenticated

El uso del método del mismo nombre está en desuso en Django 2.0, y ya no se menciona en la documentación de Django.


Tenga en cuenta que para Django 1.10 y 1.11, el valor de la propiedad es CallableBoolay no booleano, lo que puede causar algunos errores extraños. Por ejemplo, tuve una vista que devolvió JSON

return HttpResponse(json.dumps({
    "is_authenticated": request.user.is_authenticated()
}), content_type='application/json') 

que después de actualizar a la propiedad request.user.is_authenticatedestaba lanzando la excepción TypeError: Object of type 'CallableBool' is not JSON serializable. La solución fue usar JsonResponse, que podría manejar el objeto CallableBool correctamente al serializar:

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})
Mark Chackerian
fuente
1
pero is_authenticated (plantillas internas y externas) siempre devuelve True para un usuario real (y False para un usuario anónimo), independientemente de si el usuario ha iniciado sesión o no.
Tony Suffolk 66
Eso está bien porque este método se usa request.user. Si un usuario ha iniciado sesión o no solo importa en el contexto de la solicitud, por ejemplo, la sesión del navegador.
Mark Chackerian
Suponiendo que la aplicación desconecta correctamente a los usuarios, he visto algunos que no.
Tony Suffolk 66
22

El siguiente bloque debería funcionar:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
Sopan
fuente
2
pero is_authenticated (plantillas internas y externas) siempre devuelve True, independientemente de si el usuario ha iniciado sesión o no.
Tony Suffolk 66
El documento dice: Atributo de solo lectura que siempre es Verdadero (a diferencia de AnonymousUser.is_authenticated que siempre es Falso). Esta es una manera de saber si el usuario ha sido autenticado. Esto no implica ningún permiso y no verifica si el usuario está activo o tiene una sesión válida. Aunque normalmente verificará este atributo en request.user para averiguar si ha sido rellenado por AuthenticationMiddleware (que representa al usuario actualmente conectado), debe saber que este atributo es True para cualquier instancia de usuario.
Sopan
Entonces, si desea mostrar: los usuarios no autenticados como "Invitado de bienvenida" y los usuarios autenticados como "Bienvenido .USERNAME", entonces el siguiente bloque en las plantillas puede funcionar: {% if user.is_authenticated%} <p> Bienvenido {{user.username }} !!! </p> {% else%} <p> Bienvenido Invitado !!! </p> {% endif%}
Sopan
7

En tu opinión:

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

En sus funciones de controlador agregue decorador:

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):
Cubiczx
fuente
pero is_authenticated (tanto las plantillas internas como las externas) siempre devuelve True, independientemente de si el usuario ha iniciado sesión o no.
Tony Suffolk 66
mejor para el usuario request.user.is_authenticatedsi sabe que su aplicación siempre cerrará la sesión del usuario
Tony Suffolk 66
0

Si desea buscar usuarios autenticados en su plantilla, entonces:

{% if user.is_authenticated %}
    <p>Authenticated user</p>
{% else %}
    <!-- Do something which you want to do with unauthenticated user -->
{% endif %}
Suyash Kumar
fuente
-5

Para las versiones de Django 2.0+ use:

    if request.auth:
       # Only for authenticated users.

Para obtener más información, visite https://www.django-rest-framework.org/api-guide/requests/#auth

request.user.is_authenticated () se ha eliminado en las versiones Django 2.0+.

Jatin Goyal
fuente
77
request.user.is_authenticatedaun es válido. Se hace referencia a la documentación de Django-resto-marco no Django
grouchoboy