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.
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
.
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 %}
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
})
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):
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