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

mgP*_*ePe 5 python authentication django templates django-registration

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

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

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

{{user.is_anonymous }} 
Run Code Online (Sandbox Code Playgroud)

也返回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 %}
Run Code Online (Sandbox Code Playgroud)

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

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

def home(request):
    return render_jinja(request, 'index.html', blah = 'ga')
Run Code Online (Sandbox Code Playgroud)

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

return render_jinja(request, 'index.html', blah = 'ga')
Run Code Online (Sandbox Code Playgroud)

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

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

ist*_*ble 11

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

我没有使用jinja的经验,但您可能需要检查并确保将jinja和django模板语法之间的差异考虑在内.我所知道的最大区别是方法调用需要显式括号.因此,示例中的is_authenticated和is_anonymous调用需要括号.

Jinja style {{ user.is_authenticated() }}
Django style {{ user.is_authenticated }} 
Run Code Online (Sandbox Code Playgroud)

如果这不能解决问题,请尝试安装django-debug-toolbar并查看模板的上下文.检查并查看是否user为None或对象(User或AnonymousUser).

您还可以阅读AnonymousUser,并查看在文档中检查经过身份验证的用户的示例.简而言之,对于AnonymousUser对象,is_anonymous()始终返回True而不是False,而is_authenticated()始终返回False而不是True.