Django:is_authenticated和is_anonymous都在注销后返回true

时间:2010-11-28 18:47:10

标签: python django templates authentication django-registration

我正在使用django-registration,只是设置它。

{{user.is_authenticated }}

是真的,即使我已经去了/ accounts / logout /并将用户注销了。

{{user.is_anonymous }} 

也返回true。根据django docs的说法,这两者应该是不同的:

  

is_anonymous:始终返回False。这是区分User和AnonymousUser对象的一种方法。通常,您应该更喜欢将is_authenticated()用于此方法。

  

is_authenticated:始终返回True。这是一种判断用户是否已通过身份验证的方法。这并不意味着任何权限,也不会检查用户是否处于活动状态 - 它只表示用户提供了有效的用户名和密码。

我正在使用django-registration附带的标准视图,但尚未触及它们。在tempalate中我有以下代码:

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

问题出在哪里?我会非常感激的!

更新: 我注意到在主页上,它都是is_authenticated,id_anonymous返回True,而如果我在登录之前进入/ accounts / login,只有is_anonymous返回true应该是。而且,在主页上,如果有帮助,我有以下观点:

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

更新2: print(request.user.is_authenticated())给出False。然后,我有:

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

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

更新3: 如果我使用render_to_response而不是render_jinja,那么一切都很好。仍然不知道如何解决这个问题:(

2 个答案:

答案 0 :(得分:11)

好像你想要同时弄清楚两件事;使用jinja模板的正确方法是什么,以及User / AnonymousUser的处理方式是什么。也许试着一次找出这些问题。

我没有使用jinja的经验,但您可能需要检查并确保考虑differences between jinja and django template syntax。我所知道的最大区别是方法调用需要显式括号。所以你的例子中的is_authenticated和is_anonymous调用需要括号。

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

如果仍无法解决问题,请尝试安装django-debug-toolbar并查看模板的上下文。检查并查看user是否为无或对象(用户或匿名用户)。

您还可以阅读AnonymousUser,并在文档中查看checking for an authenticated user的示例。简而言之,对于AnonymousUser对象,is_anonymous()始终返回True而不是False,而is_authenticated()始终返回False而不是True。

答案 1 :(得分:4)

砸到头上。我在某处读到了:

  

如果user.is_authenticated:       ....#总是如此,因为它是一种方法!

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