304 votes

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

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

request.user.is_authenticated

malgré la certitude que l'utilisateur est connecté, il renvoie juste :

>

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

request.user.is_active

qui renvoie une réponse positive.

1 votes

Is_authenticated (à l'intérieur comme à l'extérieur des modèles) renvoie toujours True, que l'utilisateur soit connecté ou non. Pour vraiment identifier si un utilisateur est connecté, la seule solution semble être de comparer la date et l'heure de sa dernière consultation avec le délai d'attente.

601voto

Brian Neal Points 13668

Mise à jour pour Django 1.10+. :

is_authenticated est maintenant un attribut dans Django 1.10.

Cette méthode a été supprimée dans Django 2.0.

Pour Django 1.9 et plus :

is_authenticated est une fonction. Vous devez l'appeler comme

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

Comme l'a souligné Peter Rowell, ce qui peut vous faire trébucher, c'est que dans le langage de modèle par défaut de Django, on n'ajoute pas de parenthèses pour appeler les fonctions. Vous avez donc peut-être vu quelque chose comme ceci dans le code du modèle :

{% if user.is_authenticated %}

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

0 votes

Oh ok merci pour l'info, cela explique pourquoi ça ne marchait pas, à moins que j'ai raté quelque chose, ce n'est vraiment pas clair dans la documentation de django

3 votes

@Rick : Je ne suis pas d'accord avec vous. is_authenticated() est le deuxième élément listé dans la liste de l'article. méthodes de la classe models.User. Ce qui peut prêter à confusion, c'est que le modèle de langue fait pas utilisent les () de fin de ligne, de sorte que vous pourriez voir quelque chose comme {% if user.is_authenticated %}. Vous obtiendrez une erreur si vous mettez les (). (Voir docs.djangoproject.com/fr/dev/topics/auth/ et docs.djangoproject.com/fr/1.2/topics/templates/#variables )

2 votes

@Peter, ils n'utilisent pas () dans les exemples, je réalise 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 agréable quand une API utilise la syntaxe de la vie réelle afin qu'elle puisse être rapidement assimilée par quelqu'un de nouveau dans un projet comme Django, juste une bête noire je suppose que j'ai tendance à survoler les choses mais je réalise que j'aurais dû regarder de plus près, merci pour l'aide.

56voto

Mark Chackerian Points 1562

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épréciée 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 fichier de type CallableBool et non un booléen, ce qui peut provoquer des bogues étranges. Par exemple, j'avais une vue qui renvoyait du JSON

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

qui, après avoir été mis à jour, devient la propriété request.user.is_authenticated lançait 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 votes

Mais is_authenticated (à l'intérieur comme à l'extérieur des modèles) renvoie toujours True pour un utilisateur réel (et False pour un utilisateur anonyme) - que l'utilisateur soit effectivement connecté ou non.

0 votes

Ce n'est pas grave car cette méthode est utilisée pour request.user . Le fait qu'un utilisateur soit connecté ou non n'a d'importance que dans le contexte de la demande, par exemple la session du navigateur.

0 votes

En supposant que l'application déconnecte correctement les utilisateurs - j'en ai vu qui ne le faisaient pas.

30voto

Sopan Points 31

Le bloc suivant devrait fonctionner :

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

2 votes

Mais is_authenticated (à l'intérieur comme à l'extérieur des modèles) renvoie toujours True - que l'utilisateur soit effectivement connecté ou non.

0 votes

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

0 votes

Donc si vous voulez afficher - les utilisateurs non authentifiés comme "Welcome Guest" et les utilisateurs authentifiés comme "Welcome .USERNAME" alors le bloc suivant dans les modèles peut fonctionner : {% if user.is_authenticated %} <p>Bienvenue {{ user.username }} !!!</p> {% else %} <p>Bienvenue à l'invité ! !! </p> {% endif %}

9voto

Cubiczx Points 685

A votre avis :

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

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

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):

0 votes

Mais is_authenticated (à l'intérieur comme à l'extérieur des modèles) renvoie toujours True - que l'utilisateur soit effectivement connecté ou non.

0 votes

Mieux pour l'utilisateur request.user.is_authenticated si vous savez que votre application va toujours déconnecter l'utilisateur.

5voto

Suyash Kumar Points 73

Si vous voulez vérifier les 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 %}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X