'AnonymousUser' 对象不可迭代
'AnonymousUser' object is not iterable
if not request.user.is_authenticated:
return None
try:
return ClientProfile.objects.get(user=request.user)
except ClientProfile.DoesNotExist:
return None
此代码应该 return None,如果我没有登录并尝试调用它。但正如我从堆栈跟踪中看到的那样,它在这一行崩溃并出现错误“'AnonymousUser' object is not iterable”:
return ClientProfile.objects.get(user=request.user)
我正在以隐私模式浏览以下页面,所以我 100% 未通过身份验证。
如何解决这个问题?
在 Django 1.9 及更早版本中,is_authenticated()
是一个方法,您必须调用它。
if not request.user.is_authenticated():
...
忘记调用方法很容易出错。在您的情况下,它会导致错误,但在其他情况下,它可能允许用户访问他们不应该访问的数据。从 Django 1.10 开始,is_authenticated
正在更改为 属性 以防止出现这种情况。
如果您尝试以访客用户身份登录,则可能会出现此错误。在我的项目中,我试图在免费、企业和专业的基础上提供会员资格,但我遇到了同样的错误。
所以替换
return ClientProfile.objects.get(user=request.user)
与
return ClientProfile.objects.filter().first()
我使用另一种方法
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
if not request.user.is_authenticated:
return None
try:
return ClientProfile.objects.get(user=request.user)
except ClientProfile.DoesNotExist:
return None
此代码应该 return None,如果我没有登录并尝试调用它。但正如我从堆栈跟踪中看到的那样,它在这一行崩溃并出现错误“'AnonymousUser' object is not iterable”:
return ClientProfile.objects.get(user=request.user)
我正在以隐私模式浏览以下页面,所以我 100% 未通过身份验证。
如何解决这个问题?
在 Django 1.9 及更早版本中,is_authenticated()
是一个方法,您必须调用它。
if not request.user.is_authenticated():
...
忘记调用方法很容易出错。在您的情况下,它会导致错误,但在其他情况下,它可能允许用户访问他们不应该访问的数据。从 Django 1.10 开始,is_authenticated
正在更改为 属性 以防止出现这种情况。
如果您尝试以访客用户身份登录,则可能会出现此错误。在我的项目中,我试图在免费、企业和专业的基础上提供会员资格,但我遇到了同样的错误。
所以替换
return ClientProfile.objects.get(user=request.user)
与
return ClientProfile.objects.filter().first()
我使用另一种方法
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