Cómo comprobar si un usuario ha iniciado sesión (cómo utilizar correctamente user.is autenticado)?


Estoy mirando este sitio web pero parece que no puedo averiguar cómo hacer esto, ya que no está funcionando. Necesito comprobar 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 está conectado, solo devuelve:

>

Puedo hacer otras peticiones (desde la primera sección de la url anterior), como:

request.user.is_active

Que devuelve una respuesta exitosa.

Author: Mateusz Piotrowski, 2010-09-05

4 answers

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

Para Django 1.9 y anteriores :

is_authenticated es una función. Usted debe llamarlo como

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

Como Peter Rowell señaló, lo que puede estar sorprendiéndote es que en el lenguaje de plantilla predeterminado de Django, no usas paréntesis para llamar a funciones. Así que usted puede haber visto algo como esto en código de plantilla:

{% if user.is_authenticated %}

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

 413
Author: Brian Neal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-04 09:43:11

El siguiente bloque debería funcionar:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
 14
Author: Sopan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-02 05:46:26

Django 1.10+

Usa 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á obsoleto 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 un CallableBool y no un booleano, lo que puede causar algunos errores extraños. Por ejemplo, tuve una vista que devolvía JSON
return HttpResponse(json.dumps({
    "is_authenticated": request.user.is_authenticated()
}), content_type='application/json') 

Que después de actualizado a la propiedad request.user.is_authenticated estaba lanzando el 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
})
 10
Author: Mark Chackerian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-08 18:20:03

En su 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):
 1
Author: Cubiczx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 08:45:45