基于Django 2.0+的第三方登录Web应用,能否用request.user.is_authenticated()判断登录?
关于Django 2.0+第三方认证下判断用户登录状态的问题
嘿,这个问题问到点子上了——结合你用的Django版本和第三方认证场景,我给你理清楚:
首先明确说:绝对不能再用带括号的request.user.is_authenticated()写法了!
在Django 1.10及之后的版本(包括你使用的2.0+),is_authenticated已经从一个可调用的方法,改成了只读的布尔属性。如果强行加括号调用,会直接抛出TypeError错误,因为你试图调用一个布尔值。
正确的判断方式
不管你用的是Django内置认证还是第三方认证后端,判断用户是否登录的正确写法都是:
if request.user.is_authenticated: # 用户已登录的逻辑 else: # 用户未登录的逻辑
结合第三方认证的补充说明
只要你的第三方认证后端(比如常用的django-allauth、python-social-auth这类库)正确实现了认证流程,在用户通过第三方登录成功后,会自动把认证后的用户实例绑定到request.user上。这时候request.user.is_authenticated会准确返回True;而未登录状态下,request.user是AnonymousUser实例,这个属性会返回False——和内置认证系统的判断逻辑完全一致,不会因为第三方认证就有区别。
另外给你个小提醒:如果是在模板里判断登录状态,写法更简洁,直接用:
{% if user.is_authenticated %} <!-- 已登录用户的模板内容 --> {% endif %}
模板引擎会自动处理属性的读取,不需要加括号。
内容的提问来源于stack exchange,提问作者Rudy
相关产品推荐
相关产品推荐

