Jak sprawdzić, czy ten użytkownik jest anonimowy, czy faktycznie jest użytkownikiem mojego systemu?

84
def index(request):
    the_user = request.user

W Django, skąd mam wiedzieć, czy jest to prawdziwy użytkownik, czy nie? Próbowałem:

if the_user: ale „AnonymousUser” istnieje, nawet jeśli nikt się nie zaloguje. Dlatego zawsze zwraca wartość „prawda” i to nie działa.

TIMEX
źródło

Odpowiedzi:

140

Możesz sprawdzić, czy request.user.is_anonymouszwroty True.

Daniel DiPaolo
źródło
21
Pamiętaj, że views.pypowinieneś używać, request.user.is_anonymous()ponieważ jest to funkcja, podczas gdy w szablonach powinieneś używać{{user.is_anonymous}}
amigcamel
12
Wygląda na to, że w Django 1.9 jest to raczej is_authenticated(): zobacz docs.djangoproject.com/en/1.9/topics/auth/default/ ...
Paolo Stefan
13
z Django 1.10, is_anonymous nie jest już metodą (tylko właściwością)
maxbellec
2
Muszę zgodzić się z Paolo Stefanem, metoda, której chcesz użyć, to is_authenticated(). Zobacz także thegarywilson.com/blog/2006/is_authenticated-vs-is_anonymous
Al Sweigart
3
Aktualnym zaleceniem jest użycie request.user.is_authenticated, co jest atrybutem w Django 1.10+, takim samym jak is_anonymousteraz - patrz docs.djangoproject.com/en/dev/ref/contrib/auth/… . Zauważ, że jeśli używasz również Django Guardian, te atrybuty nie zrobią tego, co myślisz, że będą - zobacz django-guardian.readthedocs.io/en/stable/configuration.html
rhunwicks
18

Alternatywa dla

if user.is_anonymous():
    # user is anon user

polega na testowaniu, aby zobaczyć, jaki jest identyfikator obiektu użytkownika:

if user.id == None:
    # user is anon user
else:
    # user is a real user

zobacz https://docs.djangoproject.com/en/dev/ref/contrib/auth/#anonymous-users

leifos
źródło
4
wydaje się zły pomysł. user.is_anonymous () będzie nadal działać w nowych wersjach, user.id może nie, w zależności od przyszłych wdrożeń
maxbellec
Pamiętaj również, że jeśli używasz Django Guardian, anonimowy użytkownik również będzie miał identyfikator - zobacz django-guardian.readthedocs.io/en/stable/… .
rhunwicks
A obecne zalecenie zgodnie z docs.djangoproject.com/en/dev/ref/contrib/auth / ... to użycie User.is_authenticated
rhunwicks
To niestety nie działa. To była pierwsza rzecz, której spróbowałem. Wygląda na to, że „anonimowy” użytkownik pojawia się, gdy używa się user == None (i innych odmian).
Harlin
4

Wiem, że robię tu trochę grobów, ale wyszukiwanie w Google doprowadziło mnie do tej strony.

Jeśli Twój widok domyślnie wymaga, aby użytkownik był zalogowany, możesz zaimplementować dekorator @login_required:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
Karl MW
źródło
To nie zadziała w widoku "logowania" bez pewnych dostosowań.
Harlin
0

Miałem podobny problem, z wyjątkiem tego, że był to na stronie, do której został wysłany login_redirect_url. Musiałem umieścić w szablonie:

{% if user.is_authenticated %}
    Welcome Back, {{ username }}
{% endif %}
Harlin
źródło