尝试使用 Django 电子邮件确认来验证用户,但是一些用户在尝试确认他们的电子邮件时遇到此错误

Trying to verify a user with Django email confirmation, however some user's are getting this error when they try to confirm their email

我以前问过这个问题的变体,但发现我很不清楚。这是我试图更好地解释这个问题的尝试。

我向用户的电子邮件发送 link 以在他们注册网站后确认注册。但是,一小部分用户在尝试确认电子邮件时遇到以下错误。

错误:

TypeError/activate/{uidb64}/{token}/
error
'AnonymousUser' object is not iterable

我认为问题在于激活函数无法识别它们。但是,如果我将它们发送回登录页面,则不确定如何激活 link。有什么想法吗?

我是否需要添加类似 '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,
)