2010-09-05 9 views
165

Ich schaue über this website aber kann einfach nicht herausfinden, wie dies zu tun ist, da es nicht funktioniert. Ich muss überprüfen, ob die aktuelle Site-Benutzer in (authentifiziert) angemeldet ist, und ich versuche:Wie überprüft man, ob ein Benutzer angemeldet ist (wie man user.is_authenticated richtig verwendet)?

request.user.is_authenticated 

trotz sicher zu sein, dass der Benutzer angemeldet ist, gibt sie nur:

> 

I‘ m der Lage, andere Anfragen zu tun (aus dem ersten Abschnitt in der URL oben), wie zum Beispiel:

request.user.is_active 

, die eine erfolgreiche Antwort zurückgibt.

Antwort

373

is_authenticated ist eine Funktion. Sie sollten es wie

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

Wie Peter Rowell wies darauf hin, was Sie können Stolpern ist, dass in der Standard-Django Template-Sprache, die Sie nicht auf Klammer tack-Funktionen aufzurufen. So können Sie sehen so etwas wie dies in Template-Code haben:

{% if user.is_authenticated %} 

jedoch in Python-Code, es ist in der Tat ein Verfahren, in dem User Klasse.

Edit für Django 1.10: is_authenticated ist jetzt ein Attribut in Django 1.10. Die Methode existiert weiterhin für die Abwärtskompatibilität, wird jedoch in Django 2.0 entfernt.

+0

oh ok ..danke für die Info, das macht dann Sinn, wieso es nicht funktionierte, es sei denn ich habe etwas verpasst, es ist wirklich nicht klar in der django Dokumentation – Rick

+1

@Rick: Ich bitte dich, dich zu unterscheiden. is_authenticated() ist das zweite Element, das im Abschnitt * methods * der Klasse models.User aufgeführt ist. Was verwirrend sein kann, ist, dass * die * Template-Sprache * die * trailing() 's nicht verwendet, so dass Sie etwas wie {% if user.is_authenticated%} sehen. Sie erhalten einen Fehler, wenn Sie die() 's eingeben. (Siehe http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.is_authenticated und http : //docs.djangoproject.com/en/1.2/topics/templates/#variables) –

+2

@Peter, naja, sie benutzen nicht() in den Beispielen, ich realisiere, dass ich sicher bin, dass sie irgendwo erklärt haben, dass es eine Methode und Wie man es richtig macht, es ist einfach schön, wenn eine API echte Syntax verwendet, so dass sie schnell von jemandem aufgenommen werden kann, der neu in einem Projekt wie Django ist, nur ein ärgerlicher Pisse, da ich dazu tendiere, Dinge zu überfliegen realisiere, dass ich näher hätte schauen sollen, danke für die Hilfe – Rick

13

Nach Block sollte funktionieren:

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

Django 1.10+

Verwenden eines Attributs, nicht eine Methode:

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

Die Verwendung des Verfahrens des gleichen Name 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, ist der Wert der Eigenschaft ein CallableBool ist und kein boolean, die einige seltsame Fehler verursachen können. Zum Beispiel hatte ich eine Ansicht, die JSON zurück

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

, die nach der Eigenschaft aktualisiert request.user.is_authenticated die Ausnahme TypeError: Object of type 'CallableBool' is not JSON serializable wirft wurde. Die Lösung war JsonResponse zu verwenden, die richtig die CallableBool Objekt handhaben könnte, wenn die Serialisierung:

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

Ihrer Ansicht:

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

In Ihrem Controller-Funktionen hinzufügen Dekorateur:

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