Django:注销后is_authenticated和is_anonymous都返回真

5 投票
2 回答
8540 浏览
提问于 2025-04-16 07:43

我正在使用django-registration,并且刚刚设置好。

{{user.is_authenticated }}

即使我已经去过 /accounts/logout/ 并且把用户登出了,结果还是为真。

{{user.is_anonymous }} 

返回的结果也是对的。根据django的文档,这两个应该是不同的:

is_anonymous: 总是返回假。这是用来区分用户和匿名用户的。一般来说,你应该更倾向于使用is_authenticated()这个方法。

还有

is_authenticated: 总是返回真。这是用来判断用户是否已经通过身份验证。这并不意味着用户有任何权限,也不检查用户是否活跃——它只是表明用户提供了有效的用户名和密码。

我使用的是django-registration自带的标准视图,至今还没有动过它们。在模板中,我有以下代码:

{% if user.is_authenticated %}
{% user }}
{% if user.is_anonymous %}
    is anonymous
{% endif $}
{% else %}
    gotta login
{% endif %}

问题出在哪里呢?我会非常感激你的帮助!

更新: 我注意到在主页上,is_authenticated和is_anonymous都返回真,而如果我在登录之前去 /accounts/login,只有is_anonymous返回真,这样才对。而且,在主页上,我有以下视图,如果这能帮到你:

def home(request):
    return render_jinja(request, 'index.html', blah = 'ga')

更新2: print(request.user.is_authenticated()) 返回假。然后,我有:

return render_jinja(request, 'index.html', blah = 'ga')

在模板中,user.is_authenticated返回假。

更新3: 如果我使用render_to_response,而不是render_jinja,一切都正常。不过我还是不知道该怎么解决这个问题 :(

2 个回答

4

真是让我恍然大悟。我在某个地方看到过:

如果用户已经登录(is_authenticated),那么这个条件总是成立,因为它是一个方法!

所以,在模板中,应该用 {{user.is_authenticated()}},而不是 {{user.is_authenticated}}。

11

看起来你在同时想弄清楚两个问题:如何正确使用jinja模板,以及User和AnonymousUser之间的关系。或许你可以先一个一个地解决这些问题。

我对jinja没有经验,但你可能需要确认一下自己是否考虑到了jinja和django模板语法之间的区别。我知道的最大区别是,调用方法时需要明确加上括号。所以你例子中的is_authenticated和is_anonymous调用都需要加上括号。

Jinja style {{ user.is_authenticated() }}
Django style {{ user.is_authenticated }} 

如果这样还解决不了问题,可以试着安装django-debug-toolbar,然后查看一下你的模板的上下文。看看user是None还是一个对象(User或AnonymousUser)。

你还可以阅读一下AnonymousUser的相关内容,看看文档中关于检查用户是否已认证的例子。简单来说,对于一个AnonymousUser对象,is_anonymous()总是返回True,而is_authenticated()总是返回False。

撰写回答