如何检查用户是否已登录(如何正确使用user.is_authenticated)?

334

我正在查看这个网站,但似乎无法弄清楚如何实现,因为它没有起作用。我需要检查当前站点用户是否已登录(通过身份验证),并尝试使用以下方法:

request.user.is_authenticated
尽管确定用户已登录,它只返回:
>

我能够执行其他请求(来自上面网址的第一部分),例如:

request.user.is_active

这会返回一个成功的响应。


1
is_authenticated(模板内外)始终返回True - 无论用户是否已登录。要真正确定用户是否已登录,唯一的解决方案似乎是将其last_seen日期/时间与超时进行比较。 - Tony Suffolk 66
7个回答

644

适用于Django 2.0及更高版本的更新

is_authenticated是一个属性

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

对于Django 1.9及更早版本

is_authenticated()是一个函数。调用方式如下:

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

正如Peter Rowell所指出的那样,可能让你感到困惑的是,在默认的Django模板语言中,你不需要在调用函数时添加括号。所以在模板代码中你可能会看到类似这样的写法:
{% if user.is_authenticated %}

然而,在Python代码中,它确实是User类中的一个方法。
注意:该方法在Django 2.0中已被移除。

3
@Rick: 我不同意你的看法。is_authenticated() 是 models.User 类中 methods 部分列出的第二项。可能令人困惑的是 模板语言 不使用尾随的 (),所以你可能会看到像 {% if user.is_authenticated %} 这样的内容。如果你添加了 (),就会出现错误。(请参见 http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.is_authenticated 和 http://docs.djangoproject.com/en/1.2/topics/templates/#variables) - Peter Rowell
2
@Peter,好吧,在这些示例中他们没有使用(),我意识到他们肯定在某个地方解释了它是一个方法以及如何正确使用它,但当API使用真实的语法时,对于像Django这样的新项目的人来说,可以快速理解,这只是我的小习惯而已,我倾向于浏览事物,但我意识到我应该更仔细地看,谢谢你的帮助。 - Rick
4
@Rick:我完全同意您关于真实语法的观点。我听说过(我认为)他们不使用“真正”的编程语言作为模板系统的原因是很糟糕的,但这就是他们所做的。您可以选择使用Jinja2(http://jinja.pocoo.org/2/),它将给您完整的Python功能,但由于绝大多数第三方应用程序使用Django系统,因此往往很难混合使用。查看ExprTag(http://djangosnippets.org/snippets/9/)以了解在Django模板中获取表达式的方法。它有效。 - Peter Rowell
3
文档显示不同版本的内容不同。看起来在1.10版本中,它不再是一个方法。 - yairchu
4
对于 Django 3+,如果 request.user.is_authenticated,则为真。 - Ajay Kumar
显示剩余16条评论

62

Django 1.10+

使用属性而不是方法:

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

在Django 2.0中,同名方法的使用已被弃用,并且不再在Django文档中提及。


请注意,在Django 1.10和1.11中,该属性的值是CallableBool而不是布尔类型,这可能会导致一些奇怪的错误。例如,我有一个返回JSON的视图

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

升级到属性request.user.is_authenticated后,抛出了异常TypeError: Object of type 'CallableBool' is not JSON serializable。解决方法是使用JsonResponse,在序列化时可以正确处理CallableBool对象:

```python return JsonResponse({'is_authenticated': request.user.is_authenticated()}) ```
return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})

1
但是在模板内外,is_authenticated(对于真实用户始终返回True(对于匿名用户返回False)-无论用户是否已经登录。 - Tony Suffolk 66
这没关系,因为这种方法是用于 request.user 的。无论用户是否登录,只有在请求的上下文中才有影响,例如浏览器会话。 - Mark Chackerian
假设应用程序正确地注销用户 - 我见过一些没有这样做的。 - Tony Suffolk 66

31

以下代码块应该能正常工作:

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

2
但是 is_authenticated(无论在模板内部还是外部)始终返回True - 无论用户是否实际上已登录。 - Tony Suffolk 66
文档说明:只读属性始终为True(与AnonymousUser.is_authenticated相反,后者始终为False)。这是一种判断用户是否已经通过身份验证的方法。这不意味着任何权限,并且不检查用户是否处于活动状态或具有有效会话。尽管通常您将在request.user上检查此属性,以了解它是否已由AuthenticationMiddleware填充(表示当前登录的用户),但您应该知道此属性对于任何User实例都为True。 - Sopan
如果您想将未经身份验证的用户显示为“欢迎访客”,并将经过身份验证的用户显示为“欢迎.USERNAME”,则模板中的以下代码块可以起作用:{% if user.is_authenticated %} <p>欢迎 {{ user.username }} !!!</p> {% else %} <p>欢迎访客!!! </p> {% endif %} - Sopan

10

在您看来:

{% if user.is_authenticated %}
<p>{{ user }}</p>
{% endif %}
在您的控制器函数中添加装饰器:
from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):

但是 is_authenticated(无论在模板内部还是外部)始终返回True - 无论用户是否实际上已登录。 - Tony Suffolk 66
如果您知道应用程序将始终注销用户,则最好使用request.user.is_authenticated - Tony Suffolk 66

6

如果您想在模板中检查经过身份验证的用户,请执行以下操作:

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

-2

在views.py文件中检查用户是否已登录(已验证用户),可以使用“is_authenticated”方法,如下面的示例:

def login(request):
    if request.user.is_authenticated:
        print('yes the user is logged-in')
    else:
        print('no the user is not logged-in')

要在HTML模板文件中检查用户是否已登录(已验证用户),您可以像以下示例那样使用它:

 {% if user.is_authenticated %}
    Welcome,{{request.user.first_name}}           

 {% endif %}

这只是一个例子,根据您的需求进行更改。

我希望对您有所帮助。


-6

8
request.user.is_authenticated 仍然有效。您引用的是django-rest-framework文档而不是django - grouchoboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接