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

Posted

技术标签:

【中文标题】尝试使用 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 【发布时间】:2020-05-13 07:53:24 【问题描述】:

我之前问过这个问题的一个变体,但意识到我很不清楚。这是我试图更好地解释这个问题的尝试。

在用户注册网站后,我会发送一个指向用户电子邮件的链接以确认注册。但是,一小部分用户在尝试确认电子邮件时会收到以下错误。

错误:

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,
        )

【问题讨论】:

请帮助某人:),我已经考虑了一个星期。 你能分享完整的错误堆栈跟踪吗? @ruddra 你在堆栈跟踪中特别寻找什么,有很多。我想我添加了最相关的部分。 如果您将其添加到行号以及您在哪一行代码中遇到错误,我更愿意? object 是 python 关键字,不应真正用作变量名 【参考方案1】:

我认为您激活用户的方法在这里是错误的。我认为您不需要激活经过身份验证的用户。因为如果他们通过了身份验证,就意味着他们是活跃用户,因此他们不需要激活。

关于错误,当用户被激活时,您会在此处获得用户信息:

if user is not None and account_activation_token.check_token(user, token):  # <-- in user variable

那么为什么不在下一节中使用它(根据 cmets):

obj, created = User_Profile.objects.get_or_create(
    user=user,  # <-- here
    email_validated=True,
)

【讨论】:

我明白了。这不是错误所在的行 - 它是以下行 - email_validated = True。你如何解释'AnonymousUser'不可迭代? 你在cmets中说it's under the if statement: 'If not user is None..:.' ,你应该得到user的值,这是你通过令牌验证得到的。 实际上,我正在查看变量,它正在为该用户提取用户信息。用户拥有正确的用户。但是为什么它只是有时会失败,如果这是问题,它不应该总是失败吗? 当我尝试在另一个浏览器中激活链接时仍然失败,而不是我创建帐户的位置。 因为在这些情况下用户已通过身份验证(用户已登录)。

以上是关于尝试使用 Django 电子邮件确认来验证用户,但是一些用户在尝试确认他们的电子邮件时收到此错误的主要内容,如果未能解决你的问题,请参考以下文章

用户注册后如何发送验证/确认电子邮件

Django中的电子邮件验证

django-allauth:如何修改电子邮件确认 url?

Django 自定义用户电子邮件帐户验证

Django中的电子邮件确认实现

Rails 中的电子邮件确认,无需使用任何现有的身份验证 gem/插件