'AnonymousUser'对象不可迭代。

12
if not request.user.is_authenticated:
    return None

try:
    return ClientProfile.objects.get(user=request.user)
except ClientProfile.DoesNotExist:
    return None

如果我未登录并试图调用此代码,则此代码应返回None。但是从堆栈跟踪中可以看出,它在此行崩溃,并显示错误“'AnonymousUser' object is not iterable”:

这段代码应该在用户未登录时返回None。但是根据堆栈跟踪信息,在此行代码上出现了错误“'AnonymousUser' object is not iterable”。

return ClientProfile.objects.get(user=request.user)

我正在私密模式下浏览以下页面,因此我100%未经身份验证。

如何解决这个问题?

3个回答

20
在Django 1.9及更早版本中,is_authenticated()是一个方法,你必须调用它。
if not request.user.is_authenticated():
    ...

忘记调用方法是一个容易犯的错误。在你的情况下,这导致了一个错误,但在其他情况下,它可能会允许用户访问他们不应该访问的数据。从Django 1.10开始,is_authenticated将变为一个属性以防止这种情况。


1

如果您尝试以访客用户身份登录,则可能会出现此错误。在我的项目中,我试图根据免费、企业和专业的基础提供会员资格,但我遇到了相同的错误。

因此,请将

return ClientProfile.objects.get(user=request.user)

替换为

return ClientProfile.objects.filter().first()


0

我采用另一种方法

from django.contrib.auth.models import AnonymousUser

user = request.user if type(request.user) is not AnonymousUser else None
try:
    ClientProfile.objects.get(user=user)
except ClientProfile.DoesNotExist:
    pass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接