之前我问过这个问题的一个变体,但意识到我还不清楚。这是我试图更好地解释问题的尝试。
我在用户注册网站后向用户的电子邮件发送链接以确认注册。但是,一小部分用户在尝试确认电子邮件时收到以下错误。
错误:
TypeError/activate/{uidb64}/{token}/
error
'AnonymousUser' object is not iterable
我认为问题在于激活功能无法识别它们。但是,如果我将其发送回登录页面,则不确定如何使此激活链接起作用。有什么想法吗?
我是否需要添加类似'if not user.is_authenticated:'之类的内容,然后发送重定向登录?但是,如何返回激活功能?在所有情况下,我的应用程序都可以登录。
激活代码:
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except(TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
.... do something
else:
return HttpResponse('Activation link is invalid!')
我在这里创建电子邮件:
def activation_email(request):
if request.user.is_authenticated:
user=request.user
message = render_to_string('email.html', {
'user':user,
'token':account_activation_token.make_token(user),
'uid':urlsafe_base64_encode(force_bytes(user.pk)),
})
....send mail
else:
return redirect('somewhere_else')
编辑>:当我尝试用电子邮件验证信息更新模型时失败:
if user is not None and account_activation_token.check_token(user, token):
object, created = User_Profile.objects.get_or_create(
user=request.user,
## This is where it fails
email_validated=True,
)
我认为您激活用户的方法在这里是错误的。我认为您不需要激活经过身份验证的用户。因为如果他们通过身份验证,则意味着他们是活动用户,因此他们不需要激活。
关于错误,激活用户后,您在此处获得了用户信息:
if user is not None and account_activation_token.check_token(user, token): # <-- in user variable
所以为什么不在下一节中使用它(根据评论):
obj, created = User_Profile.objects.get_or_create(
user=user, # <-- here
email_validated=True,
)