Wie überprüfe ich, ob ein Benutzer angemeldet ist (wie verwende ich user.is_authenticated richtig)?

250

Ich schaue mir diese Website an , kann aber anscheinend nicht herausfinden, wie das geht, da es nicht funktioniert. Ich muss überprüfen, ob der aktuelle Site-Benutzer angemeldet (authentifiziert) ist, und versuche:

request.user.is_authenticated

Obwohl sichergestellt ist, dass der Benutzer angemeldet ist, wird nur Folgendes zurückgegeben:

>

Ich kann andere Anfragen stellen (aus dem ersten Abschnitt der obigen URL), wie zum Beispiel:

request.user.is_active

Dies gibt eine erfolgreiche Antwort zurück.

Rick
quelle
1
is_authenticated (sowohl innerhalb als auch außerhalb von Vorlagen) gibt immer True zurück - unabhängig davon, ob der Benutzer tatsächlich angemeldet ist oder nicht. Um wirklich festzustellen, ob ein Benutzer angemeldet ist, scheint die einzige Lösung darin zu bestehen, sein zuletzt gesehenes Datum / seine letzte Uhrzeit mit dem Zeitlimit zu vergleichen
Tony Suffolk 66,

Antworten:

509

Update für Django 1.10+ : is_authenticatedist jetzt ein Attribut in Django 1.10. Die Methode ist aus Gründen der Abwärtskompatibilität weiterhin vorhanden, wird jedoch in Django 2.0 entfernt.

Für Django 1.9 und älter :

is_authenticatedist eine Funktion. Du solltest es so nennen

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

Wie Peter Rowell betonte, kann es sein, dass Sie in der Standard-Django-Vorlagensprache keine Klammern verwenden, um Funktionen aufzurufen. Vielleicht haben Sie so etwas im Vorlagencode gesehen:

{% if user.is_authenticated %}

Im Python-Code handelt es sich jedoch tatsächlich um eine Methode in der UserKlasse.

Brian Neal
quelle
oh ok .. danke für die Info, das macht dann Sinn, warum es nicht funktioniert hat, es sei denn, ich habe etwas verpasst, es ist wirklich nicht klar darüber in der Django-Dokumentation
Rick
2
@ Rick: Ich bitte dich zu unterscheiden. is_authenticated () ist das zweite Element, das im Methodenabschnitt von Klassenmodellen aufgeführt ist. Was kann verwirrend ist , dass die Template - Sprache ist nicht den Hinter (Verwendung) 's, so dass Sie so etwas wie {% if user.is_authenticated%} sehen könnten. Wenn Sie die () eingeben , wird eine Fehlermeldung angezeigt . (Siehe docs.djangoproject.com/de/dev/topics/auth/… und docs.djangoproject.com/de/1.2/topics/templates/#variables )
Peter Rowell
2
@Peter, nun, sie verwenden () in den Beispielen nicht. Mir ist klar, dass sie sicher irgendwo erklärt haben, dass es sich um eine Methode handelt und wie man es richtig macht. Es ist einfach schön, wenn eine API die Syntax des realen Lebens verwendet, damit es funktioniert kann schnell von jemandem aufgenommen werden, der neu in einem Projekt wie Django ist, nur ein kleiner Ärger, denke ich, da ich dazu neige, Dinge zu überfliegen, aber mir ist klar, dass ich genauer hinsehen sollte, danke für die Hilfe
Rick
4
@ Rick: Ich stimme dir in Bezug auf die Syntax im wirklichen Leben voll und ganz zu. Ich habe die (was ich denke) lahmen Gründe gehört, warum sie keine "echte" Programmiersprache für das Vorlagensystem verwenden, aber genau das haben sie getan. Sie können Jinja2 ( jinja.pocoo.org/2 ) verwenden und es bietet Ihnen alle Python-Funktionen. Da jedoch die überwiegende Mehrheit der Apps von Drittanbietern das Django-System verwendet, ist es oft schwierig, sie zu mischen. Unter ExprTag ( djangosnippets.org/snippets/9 ) finden Sie eine Möglichkeit, Ausdrücke in Django-Vorlagen abzurufen . Es klappt.
Peter Rowell
3
@ Rick die Dokumentation sagt verschiedene Dinge für verschiedene Versionen. Sieht aus wie für 1.10 ist es keine Methode mehr
Yairchu
32

Django 1.10+

Verwenden Sie ein Attribut, keine Methode:

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

Die Verwendung der gleichnamigen Methode ist in Django 2.0 veraltet und wird in der Django-Dokumentation nicht mehr erwähnt.


Beachten Sie, dass für Django 1.10 und 1.11 der Wert der Eigenschaft a CallableBoolund kein Boolescher Wert ist , was einige seltsame Fehler verursachen kann. Zum Beispiel hatte ich eine Ansicht, die JSON zurückgab

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

dass nach der Aktualisierung der Eigenschaft request.user.is_authenticateddie Ausnahme ausgelöst wurde TypeError: Object of type 'CallableBool' is not JSON serializable. Die Lösung bestand darin, JsonResponse zu verwenden, das das CallableBool-Objekt bei der Serialisierung ordnungsgemäß verarbeiten kann:

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})
Mark Chackerian
quelle
1
is_authenticated (sowohl innerhalb als auch außerhalb von Vorlagen) gibt jedoch immer True für einen echten Benutzer (und False für einen anonymen Benutzer) zurück - unabhängig davon, ob der Benutzer tatsächlich angemeldet ist oder nicht.
Tony Suffolk 66
Das ist in Ordnung, da diese Methode angewendet wird request.user. Ob ein Benutzer angemeldet ist oder nicht, spielt nur eine Rolle im Kontext der Anforderung, beispielsweise der Browsersitzung.
Mark Chackerian
Vorausgesetzt, die Anwendung meldet Benutzer korrekt ab - ich habe einige gesehen, die dies nicht tun.
Tony Suffolk 66
22

Der folgende Block sollte funktionieren:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
Sopan
quelle
2
is_authenticated (sowohl innerhalb als auch außerhalb von Vorlagen) gibt jedoch immer True zurück - unabhängig davon, ob der Benutzer tatsächlich angemeldet ist oder nicht.
Tony Suffolk 66
Das Dokument lautet: Schreibgeschütztes Attribut, das immer wahr ist (im Gegensatz zu AnonymousUser.is_authenticated, das immer falsch ist). Auf diese Weise können Sie feststellen, ob der Benutzer authentifiziert wurde. Dies impliziert keine Berechtigungen und prüft nicht, ob der Benutzer aktiv ist oder eine gültige Sitzung hat. Obwohl Sie dieses Attribut normalerweise auf request.user überprüfen, um festzustellen, ob es von der AuthenticationMiddleware (die den aktuell angemeldeten Benutzer darstellt) gefüllt wurde, sollten Sie wissen, dass dieses Attribut für jede Benutzerinstanz True ist.
Sopan
Wenn Sie also nicht authentifizierte Benutzer als "Welcome Guest" und authentifizierte Benutzer als "Welcome .USERNAME" anzeigen möchten, kann der folgende Block in Vorlagen funktionieren: {% if user.is_authenticated%} <p> Welcome {{user.username }} !!! </ p> {% else%} <p> Willkommener Gast !!! </ p> {% endif%}
Sopan
7

Aus Ihrer Sicht:

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

Fügen Sie in Ihren Controller-Funktionen Dekorator hinzu:

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):
Cubiczx
quelle
is_authenticated (sowohl innerhalb als auch außerhalb von Vorlagen) gibt jedoch immer True zurück - unabhängig davon, ob der Benutzer tatsächlich angemeldet ist oder nicht.
Tony Suffolk 66
Besser für Benutzer, request.user.is_authenticatedwenn Sie wissen, dass Ihre Anwendung den Benutzer immer abmeldet
Tony Suffolk 66
0

Wenn Sie in Ihrer Vorlage nach authentifizierten Benutzern suchen möchten, gehen Sie wie folgt vor:

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

Verwenden Sie für Django 2.0+ Versionen:

    if request.auth:
       # Only for authenticated users.

Weitere Informationen finden Sie unter https://www.django-rest-framework.org/api-guide/requests/#auth

request.user.is_authenticated () wurde in Django 2.0+ Versionen entfernt.

Jatin Goyal
quelle
7
request.user.is_authenticatedIst noch gültig. Sie verweisen auf Django-Rest-Framework-Dokumentation, nicht auf Django
Grouchoboy