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

Ric*_*ick 225 python authentication django

我正在浏览这个网站,但似乎无法弄清楚如何做到这一点,因为它不起作用.我需要检查当前站点用户是否已登录(已通过身份验证),并且正在尝试:

request.user.is_authenticated
Run Code Online (Sandbox Code Playgroud)

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

>
Run Code Online (Sandbox Code Playgroud)

我可以做其他请求(来自上面网址的第一部分),例如:

request.user.is_active
Run Code Online (Sandbox Code Playgroud)

返回成功的响应.

Bri*_*eal 478

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
Run Code Online (Sandbox Code Playgroud)

正如Peter Rowell指出的那样,可能会让你失望的是,在默认的Django模板语言中,你没有使用括号来调用函数.所以你可能在模板代码中看到过这样的东西:

{% if user.is_authenticated %}
Run Code Online (Sandbox Code Playgroud)

但是,在Python代码中,它确实是User类中的一种方法.

  • @Rick:我完全同意你的真实语法.我听说过(我认为)他们没有使用模板系统的"真正"编程语言的蹩脚理由,但这就是他们所做的.您可以选择使用的Jinja2(http://jinja.pocoo.org/2/),它会给你充分的Python的能力,但由于绝大多数的第三方应用程序的使用Django的系统,它往往是很难混用它们.查看ExprTag(http://djangosnippets.org/snippets/9/),了解在Django模板中获取表达式的方法.有用. (4认同)
  • @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) (3认同)
  • @Rick文档说不同版本的不同东西.看起来像1.10它不再是一种方法 (3认同)
  • @Peter,他们在示例中没有使用(),我意识到我确定他们在某处解释了它的方法以及如何正确地执行它,当API使用真实语法时它就很好了可以很快被一个像Django这样的项目的人带走,只是一个小小的烦恼我想我会倾向于浏览一些东西,但我知道我应该看得更近了,谢谢你的帮助 (2认同)
  • 对于 django 3+ 如果 request.user.is_authenticated: (2认同)

Mar*_*ian 23

Django 1.10+

使用属性,而不是方法:

if request.user.is_authenticated: # <-  no parentheses any more!
    # do something if the user is authenticated
Run Code Online (Sandbox Code Playgroud)

在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') 
Run Code Online (Sandbox Code Playgroud)

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

return JsonResponse({
    "is_authenticated": request.user.is_authenticated
})
Run Code Online (Sandbox Code Playgroud)


Sop*_*pan 17

以下块应该工作:

    {% if user.is_authenticated %}
        <p>Welcome {{ user.username }} !!!</p>       
    {% endif %}
Run Code Online (Sandbox Code Playgroud)

  • 但is_authenticated(内部和外部模板)始终返回True - 无论用户是否实际登录. (2认同)

Cub*_*czx 7

在您看来:

{% if user.is_authenticated %}
<p>{{ user }}</p>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

在您的控制器函数中添加装饰器:

from django.contrib.auth.decorators import login_required
@login_required
def privateFunction(request):
Run Code Online (Sandbox Code Playgroud)


小智 6

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

{% if user.is_authenticated %}
    <p>Authenticated user</p>
{% else %}
    <!-- Do something which you want to do with unauthenticated user -->
{% endif %}
Run Code Online (Sandbox Code Playgroud)