如何检查该用户是匿名用户还是系统上的实际用户?


81
def index(request):
    the_user = request.user

在Django中,我怎么知道它是否是真实用户?我试过了:

if the_user: 但是即使没有人登录,也存在“ AnonymousUser”。因此,它始终返回true,这是行不通的。

Answers:


136

您可以检查是否request.user.is_anonymous退货True


20
请注意,由于它是函数,因此views.py应在其中使用request.user.is_anonymous();而在模板中,则应使用{{user.is_anonymous}}
amigcamel 2014年

11
好像在Django 1.9来说比较is_authenticated():请参阅docs.djangoproject.com/en/1.9/topics/auth/default/...
保罗·斯特凡

11
从Django 1.10开始,is_anonymous不再是方法(只是一个属性)
maxbellec

2
我必须同意Paolo Stefan的观点,您要使用的方法是is_authenticated()。另请参见thegarywilson.com/blog/2006/is_authenticated-vs-is_anonymous
Al Sweigart

3
当前的建议是使用request.user.is_authenticated,它是Django 1.10+中的一个属性,与is_anonymous现在相同-请参阅docs.djangoproject.com/en/dev/ref/contrib/auth/…。请注意,如果您还使用Django Guardian,那么这些属性将不会发挥您认为的作用-请参阅django-guardian.readthedocs.io/en/stable/configuration.html
rhunwicks

18

的替代品

if user.is_anonymous():
    # user is anon user

通过测试以查看用户对象的ID是什么:

if user.id == None:
    # user is anon user
else:
    # user is a real user

参见https://docs.djangoproject.com/en/dev/ref/contrib/auth/#anonymous-users


4
似乎是个坏主意。user.is_anonymous()将继续在新版本中工作,user.id可能无法使用,具体取决于将来的实现
maxbellec

另外,请注意,如果您使用的是Django Guardian,那么匿名用户也将具有一个ID-请参阅django-guardian.readthedocs.io/en/stable/…
rhunwicks

根据docs.djangoproject.com/en/dev/ref/contrib/auth/…的当前建议是使用User.is_authenticated
rhunwicks

不幸的是,这行不通。这是我尝试的第一件事。似乎在使用user == None(和其他变体)时显示“匿名”用户。
哈林

4

我知道我在这里进行了一些认真的工作,但是Google搜索将我带到了此页面。

如果您的视图定义要求用户登录,则可以实现@login_required装饰器:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):

如果不进行一些自定义,这将无法在股票“登录”视图中使用。
哈林

0

我有一个类似的问题,除了这是将login_redirect_url发送到的页面上。我必须放入模板:

{% if user.is_authenticated %}
    Welcome Back, {{ username }}
{% endif %}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.