Django:注销后is_authenticated和is_anonymous都返回真
我正在使用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 个回答
真是让我恍然大悟。我在某个地方看到过:
如果用户已经登录(is_authenticated),那么这个条件总是成立,因为它是一个方法!
所以,在模板中,应该用 {{user.is_authenticated()}},而不是 {{user.is_authenticated}}。
看起来你在同时想弄清楚两个问题:如何正确使用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。