Como verificar se um usuário está logado (como usar corretamente user.is_authenticated)?

250

Eu estou olhando para este site, mas simplesmente não consigo descobrir como fazer isso, pois não está funcionando. Preciso verificar se o usuário do site atual está logado (autenticado) e estou tentando:

request.user.is_authenticated

apesar de ter certeza de que o usuário está logado, ele retorna apenas:

>

Sou capaz de fazer outras solicitações (da primeira seção no URL acima), como:

request.user.is_active

que retorna uma resposta bem-sucedida.

Rick
fonte
1
is_authenticated (modelos internos e externos) sempre retorna True - independentemente de o usuário estar realmente logado ou não. Para identificar verdadeiramente se um usuário está conectado, a única solução parece ser a de comparar a sua last_seen data / hora com o tempo limite
Tony Suffolk 66

Respostas:

509

Atualização para Django 1.10+ : is_authenticatedagora é um atributo no Django 1.10. O método ainda existe para compatibilidade com versões anteriores, mas será removido no Django 2.0.

Para o Django 1.9 e mais antigo :

is_authenticatedé uma função. Você deveria chamar assim

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

Como Peter Rowell apontou, o que pode estar atrapalhando você é que, na linguagem padrão do Django, você não usa parênteses para chamar funções. Então você pode ter visto algo assim no código do modelo:

{% if user.is_authenticated %}

No entanto, no código Python, é realmente um método na Userclasse.

Brian Neal
fonte
oh ok .. obrigado pela informação, que faz sentido, então por que não estava funcionando, a menos que eu perdi alguma coisa, não é muito claro sobre isso na documentação do Django
Rick
2
@ Rick: Eu imploro para diferir com você. is_authenticated () é o segundo item listado na seção de métodos dos modelos de classe. O que pode ser confuso é que o modelo de linguagem que não usar a direita () é, de modo que você pode ver algo como {% if% user.is_authenticated}. Você receberá um erro se inserir os (). (Consulte docs.djangoproject.com/en/dev/topics/auth/… e docs.djangoproject.com/en/1.2/topics/templates/#variables )
Peter Rowell
2
@ Peter, bem, eles não usam () nos exemplos, eu sei que eles explicaram em algum lugar que é um método e como fazê-lo corretamente, é bom quando uma API usa a sintaxe da vida real para que ele podem ser rapidamente levado por alguém novo para um projeto como Django, apenas uma implicância Eu acho que como eu tendem a folhear as coisas, mas eu percebo que eu deveria ter olhado mais perto, obrigado pela ajuda
Rick
4
@ Rick: Concordo plenamente com você sobre a sintaxe da vida real. Ouvi as (o que considero) razões esfarrapadas que eles têm por não usar uma linguagem de programação "real" para o sistema de modelos, mas foi o que fizeram. Você pode optar por usar o Jinja2 ( jinja.pocoo.org/2 ) e ele oferece recursos completos para Python, mas como a grande maioria dos aplicativos de terceiros usa o sistema Django, muitas vezes é difícil misturá-los. Veja no ExprTag ( djangosnippets.org/snippets/9 ) uma maneira de obter expressões dentro dos modelos do Django. Funciona.
Peter Rowell
3
@Rick a documentação diz coisas diferentes para uma versão diferente. Looks como para 1.10 ele não é mais um método
yairchu
32

Django 1.10+

Use um atributo, não um método:

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

O uso do método com o mesmo nome foi descontinuado no Django 2.0 e não é mais mencionado na documentação do Django.


Note que para o Django 1.10 e 1.11, o valor da propriedade é a CallableBoole não um booleano, o que pode causar alguns erros estranhos. Por exemplo, eu tinha uma visualização que retornava JSON

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

que depois de atualizado para a propriedade request.user.is_authenticatedestava lançando a exceção TypeError: Object of type 'CallableBool' is not JSON serializable. A solução foi usar o JsonResponse, que poderia manipular o objeto CallableBool corretamente ao serializar:

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})
Mark Chackerian
fonte
1
mas is_authenticated (modelos internos e externos) sempre retorna True para um usuário real (e False para um usuário anônimo) - independentemente de o usuário estar realmente conectado ou não.
Tony Suffolk 66
Tudo bem, porque esse método é usado request.user. Se um usuário está conectado ou não apenas importa no contexto da solicitação, por exemplo, a sessão do navegador.
Mark Chackerian
Supondo que o aplicativo efetue logoff corretamente dos usuários - eu já vi alguns que não.
Tony Suffolk 66
22

O bloco a seguir deve funcionar:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
Sopan
fonte
2
mas is_authenticated (modelos internos e externos) sempre retorna True - independentemente de o usuário estar realmente conectado ou não.
Tony Suffolk 66
O documento diz: Atributo somente leitura que é sempre True (em oposição a AnonymousUser.is_authenticated, que é sempre False). Essa é uma maneira de saber se o usuário foi autenticado. Isso não implica nenhuma permissão e não verifica se o usuário está ativo ou tem uma sessão válida. Mesmo que normalmente você verifique esse atributo em request.user para descobrir se ele foi preenchido pelo AuthenticationMiddleware (representando o usuário atualmente conectado), você deve saber que esse atributo é True para qualquer instância de Usuário.
Sopan 9/04/19
Portanto, se você deseja exibir usuários não autenticados como "Bem-vindo convidado" e autenticar usuários como "Bem-vindo .USERNAME", o seguinte bloco de modelos pode funcionar: {% if user.is_authenticated%} <p> Bem-vindo {{user.username }} !!! </p> {% else%} <p> Bem-vindo, visitante !!! </p> {% endif%}
Sopan em 9/04/19
7

Na sua opinião:

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

Em suas funções de controlador, adicione decorador:

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):
Cubiczx
fonte
mas is_authenticated (modelos internos e externos) sempre retorna True - independentemente de o usuário estar realmente conectado ou não.
Tony Suffolk 66
melhor para o usuário request.user.is_authenticatedse você sabe que a sua aplicação será sempre registrar o usuário para fora
Tony Suffolk 66
0

Se você deseja verificar se há usuários autenticados no seu modelo, então:

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

Para versões do Django 2.0+, use:

    if request.auth:
       # Only for authenticated users.

Para mais informações, visite https://www.django-rest-framework.org/api-guide/requests/#auth

request.user.is_authenticated () foi removido nas versões do Django 2.0+.

Jatin Goyal
fonte
7
request.user.is_authenticatedainda é válido. Você está referenciando a documentação do django-rest-framework e não o django
grouchoboy