web-dev-qa-db-fra.com

Comment vérifier si un utilisateur est connecté (comment utiliser correctement user.is_authenticated)?

Je regarde ce site mais je n'arrive pas à comprendre comment faire, car cela ne fonctionne pas. Je dois vérifier si l'utilisateur du site actuel est connecté (authentifié) et j'essaie:

request.user.is_authenticated

en dépit d'être sûr que l'utilisateur est connecté, il retourne simplement:

>

Je suis capable de faire d'autres demandes (de la première section de l'URL ci-dessus), telles que:

request.user.is_active

qui renvoie une réponse réussie.

204
Rick

Mise à jour pour Django 1.10+ : is_authenticated est maintenant un attribut dans Django 1.10. La méthode existe toujours pour la compatibilité ascendante, mais sera supprimée dans Django 2.0.

Pour Django 1.9 et plus ancien :

is_authenticated est une fonction. Vous devriez l'appeler comme

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

Comme Peter Rowell l'a fait remarquer, ce qui peut vous déranger, c'est que dans le langage par défaut de gabarit Django, vous ne colliez pas entre parenthèses pour appeler des fonctions. Donc, vous avez peut-être vu quelque chose comme ceci dans le code du template:

{% if user.is_authenticated %}

Cependant, dans le code Python, il s’agit bien d’une méthode de la classe User.

435
Brian Neal

Le bloc suivant devrait fonctionner: 

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
15
Sopan

Django 1.10+

Utilisez un attribut, not une méthode:

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

L'utilisation de la méthode du même nom est obsolète dans Django 2.0 et n'est plus mentionnée dans la documentation de Django.


Notez que pour Django 1.10 et 1.11, la valeur de la propriété est un CallableBool et non un booléen, ce qui peut causer des bugs étranges. Par exemple, j'avais une vue qui renvoyait JSON

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

que, après la mise à jour de la propriété request.user.is_authenticated, levait l’exception TypeError: Object of type 'CallableBool' is not JSON serializable. La solution consistait à utiliser JsonResponse, qui pouvait gérer correctement l'objet CallableBool lors de la sérialisation:

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})
14
Mark Chackerian

A votre avis:

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

Dans vos fonctions de contrôleur, ajoutez un décorateur:

from Django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):
1
Cubiczx