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


250

我正在看这个网站,但似乎无法弄清楚该怎么做,因为它不起作用。我需要检查当前站点用户是否已登录(已认证),并且正在尝试:

request.user.is_authenticated

尽管确定用户已登录,但它仅返回:

>

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

request.user.is_active

这将返回成功的响应。


1
is_authenticated(内部和外部模板)始终返回True-无论用户是否实际登录。为了真正确定用户是否已登录,唯一的解决方案似乎是将他们的last_seen日期/时间与超时进行比较
Tony Suffolk

Answers:


509

Django 1.10+更新is_authenticated现在是Django 1.10中的属性。为了向后兼容,该方法仍然存在,但在Django 2.0中将被删除。

对于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文档中并不清楚这一点
Rick

2
@里克:我想和你有所不同。is_authenticated()是类model.User 的方法部分中列出的第二项。什么可能会产生混淆的是,模板语言没有使用尾部()的,所以你可能会看到类似{%如果user.is_authenticated%}。如果将()放入,则会出现错误。(请参阅docs.djangoproject.com/en/dev/topics/auth/…docs.djangoproject.com/en/1.2/topics/templates/#variables
彼得·罗威尔

2
@Peter,那么他们在示例中不使用(),我意识到我可以肯定他们在某处解释了它的方法以及如何正确执行,当API在其中使用真实语法时,它就很好了,可以被像Django这样的项目新手迅速接受,我想这只是一个小麻烦,因为我倾向于略读一些东西,但是我知道我应该走近了,感谢您的帮助
Rick

4
@Rick:我完全同意您的现实生活语法。我听说过(我认为的)la脚的原因,他们没有为模板系统使用“真正的”编程语言,但这就是他们所做的。您可以选择使用Jinja2(jinja.pocoo.org/2),它将为您提供完整的Python功能,但是由于绝大多数的第三方应用程序都使用Django系统,因此通常很难将它们混合在一起。查看ExprTag(djangosnippets.org/snippets/9),了解在Django模板内部获取表达式的方法。有用。
彼得·罗威尔

3
@Rick文档对不同版本说了不同的话。对于1.10而言,它似乎不再是一种方法
yairchu '16

32

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,该属性的值是a 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对象:

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

1
但是is_authenticated(内部和外部模板)对于真实用户始终返回True(对于匿名用户而言,则返回False),无论该用户是否实际登录。
Tony Suffolk

可以,因为在上使用了此方法request.user。用户是否登录仅取决于请求的上下文,例如浏览器会话。
Mark Chackerian '18

假设应用程序正确注销了用户-我看到了一些没有的用户。
Tony Suffolk

22

以下块应该工作:

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

2
但是is_authenticated(内部和外部模板)始终返回True-无论用户是否实际登录。
Tony Suffolk

该文档说:只读属性,始终为True(与AnonymousUser.is_authenticated始终为False相对)。这是一种判断用户是否已通过身份验证的方法。这并不意味着任何权限,也不检查用户是否处于活动状态或具有有效的会话。即使通常您将在request.user上检查此属性以了解它是否已经由AuthenticationMiddleware填充(代表当前登录的用户),您也应该知道对于任何User实例,该属性均为True。
索潘

因此,如果要显示-未经身份验证的用户为“ Welcome Guest”,并将用户身份验证为“ Welcome .USERNAME”,则模板中的以下块可以起作用:{%if user.is_authenticated%} <p> Welcome {{user.username }} !!! </ p> {%else%} <p>欢迎客人!!!</ p> {%endif%}
索潘

7

您认为:

{% 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

更好的用户request.user.is_authenticated,如果你知道你的应用程序将始终注销用户
托尼萨福克66

0

如果要在模板中检查经过身份验证的用户,则:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.