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