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


250

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

request.user.is_authenticated

bien qu'il soit sûr que l'utilisateur est connecté, il renvoie juste:

>

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

request.user.is_active

qui renvoie une réponse réussie.


1
is_authenticated (à l'intérieur et à l'extérieur des modèles) renvoie toujours True - que l'utilisateur soit réellement connecté ou non. Pour identifier véritablement si un utilisateur est connecté, la seule solution semble être de comparer sa date / heure de dernière vue avec le délai d'expiration
Tony Suffolk 66

Réponses:


509

Mise à jour pour Django 1.10+ : is_authenticatedest désormais un attribut dans Django 1.10. La méthode existe toujours pour la compatibilité descendante, mais sera supprimée dans Django 2.0.

Pour Django 1.9 et versions antérieures :

is_authenticatedest une fonction. Vous devriez l'appeler comme

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

Comme Peter Rowell l'a souligné, ce qui peut vous tromper, c'est que dans le langage de modèle Django par défaut, vous n'insérez pas de parenthèses pour appeler des fonctions. Vous avez donc peut-être vu quelque chose comme ça dans le code du modèle:

{% if user.is_authenticated %}

Cependant, dans le code Python, il s'agit bien d'une méthode de la Userclasse.


oh ok .. merci pour l'info, ça a du sens alors pourquoi ça ne fonctionnait pas, à moins que j'ai raté quelque chose, ce n'est vraiment pas clair à ce sujet dans la documentation de django
Rick

2
@Rick: Je vous prie de différer avec vous. is_authenticated () est le deuxième élément répertorié dans la section méthodes de la classe models.User. Ce qui peut être déroutant, c'est que le langage du modèle n'utilise pas les caractères de fin (), vous pouvez donc voir quelque chose comme {% if user.is_authenticated%}. Vous obtiendrez une erreur si vous mettez le () dans. (Voir docs.djangoproject.com/en/dev/topics/auth/… et docs.djangoproject.com/en/1.2/topics/templates/#variables )
Peter Rowell

2
@Peter, eh bien ils n'utilisent pas () dans les exemples, je me rends compte que je suis sûr qu'ils ont expliqué quelque part que c'est une méthode et comment le faire correctement, c'est juste sympa quand une API utilise une syntaxe réelle pour qu'elle peut être rapidement pris en charge par quelqu'un de nouveau dans un projet comme Django, juste une bête noire, je suppose que j'ai tendance à parcourir les choses mais je me rends compte que j'aurais dû regarder de plus près, merci pour l'aide
Rick

4
@Rick: Je suis entièrement d'accord avec vous sur la syntaxe de la vie réelle. J'ai entendu (ce que je considère) des raisons boiteuses qu'ils ont pour ne pas utiliser un "vrai" langage de programmation pour le système de modèle, mais c'est ce qu'ils ont fait. Vous pouvez choisir d'utiliser Jinja2 ( jinja.pocoo.org/2 ) et cela vous donnera des capacités Python complètes, mais comme l'écrasante majorité des applications tierces utilisent le système Django, il est souvent difficile de les mélanger. Regardez ExprTag ( djangosnippets.org/snippets/9 ) pour un moyen d'obtenir des expressions à l'intérieur des modèles Django. Ça marche.
Peter Rowell

3
@Rick la documentation dit différentes choses pour différentes versions. On dirait que pour 1.10 ce n'est plus une méthode
yairchu

32

Django 1.10+

Utilisez un attribut, pas 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 déconseillée dans Django 2.0 et n'est plus mentionnée dans la documentation Django.


Notez que pour Django 1.10 et 1.11, la valeur de la propriété est un CallableBoolet non un booléen, ce qui peut provoquer 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') 

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

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

1
mais is_authenticated (à l'intérieur et à l'extérieur des modèles) renvoie toujours True pour un utilisateur réel (et False pour un utilisateur anonyme) - que l'utilisateur soit réellement connecté ou non.
Tony Suffolk 66

Ça va parce que cette méthode est utilisée request.user. Qu'un utilisateur soit connecté ou non importe uniquement dans le contexte de la demande, par exemple la session du navigateur.
Mark Chackerian

En supposant que l'application déconnecte correctement les utilisateurs - j'en ai vu certains qui ne le font pas.
Tony Suffolk 66

22

Le bloc suivant devrait fonctionner:

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

2
mais is_authenticated (à l'intérieur et à l'extérieur des modèles) renvoie toujours True - que l'utilisateur soit réellement connecté ou non.
Tony Suffolk 66

Le document dit: attribut en lecture seule qui est toujours vrai (par opposition à AnonymousUser.is_authenticated qui est toujours faux). C'est un moyen de savoir si l'utilisateur a été authentifié. Cela n'implique aucune autorisation et ne vérifie pas si l'utilisateur est actif ou a une session valide. Même si normalement vous vérifierez cet attribut sur request.user pour savoir s'il a été rempli par AuthenticationMiddleware (représentant l'utilisateur actuellement connecté), vous devez savoir que cet attribut est True pour toute instance d'utilisateur.
Sopan

Donc, si vous souhaitez afficher - les utilisateurs non authentifiés en tant que «Bienvenue invité» et authentifier les utilisateurs en tant que «Bienvenue .NOM D'UTILISATEUR», le bloc suivant dans les modèles peut fonctionner: {% if user.is_authenticated%} <p> Bienvenue {{user.username }} !!! </p> {% else%} <p> Bienvenue invité !!! </p> {% endif%}
Sopan

7

À 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):

mais is_authenticated (à l'intérieur et à l'extérieur des modèles) renvoie toujours True - que l'utilisateur soit réellement connecté ou non.
Tony Suffolk 66

mieux à l'utilisateur request.user.is_authenticatedsi vous savez que votre application déconnectera toujours l'utilisateur
Tony Suffolk 66

0

Si vous souhaitez rechercher des utilisateurs authentifiés dans votre modèle, alors:

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.