我一直在尝试在我的项目中实现django-allauth。我正在使用EMAIL_BACKEND向新注册用户发送电子邮件,他们需要在使用应用程序之前进行确认。但是,每个用户的验证电子邮件都会返回一个带有以下文本的视图:
“确认电子邮件地址
无法确认,因为它已被其他帐户确认。”
这是出乎意料的,因为文档和其他指南显示他们没有遇到这个问题。
我的设置遵循allauth文档(添加模板上下文处理器,站点ID,后端,应用程序和正确的URL)。可选设置如下:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
ACCOUNT_AUTHENTICATION_METHOD = 'username_email'
LOGIN_URL = 'login/'
LOGIN_REDIRECT_URL = 'portfolio/'
ACCOUNT_EMAIL_REQUIRED ='True'
ACCOUNT_EMAIL_VERIFICATION ='mandatory'
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = 'login/'
ACCOUNT_LOGOUT_ON_GET = True
ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE = True
字符串
我尝试了什么我检查了我的数据库中是否有用户在不知不觉中与新用户冲突。我删除了除了超级用户之外的所有用户,并重新安装了allauth几次。我还尝试手动创建电子邮件验证,并通过django shell验证新用户,效果很好。
我还创建了自定义视图来尝试调试手头的问题,例如:
class CustomConfirmEmailView(ConfirmEmailView):
def post(self, *args, **kwargs):
print("POST method called")
self.object = confirmation = self.get_object()
result = confirmation.confirm(self.request)
print('Confirmation result: ', result)
return super().post(*args, **kwargs)
def get(self, *args, **kwargs):
print('ConfirmEmailView get method called')
response = super().get(*args, **kwargs)
confirmation = self.get_object()
email_address = confirmation.email_address
print('Is email verified after confirmation: ', email_address.verified)
print("Confirmation key:", self.kwargs['key']) # print the confirmation key
return response
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
# Print the email_address object
print('Email address: ', self.object.email_address)
print('Is email verified: ', self.object.email_address.verified)
return ctx
def get_object(self, queryset=None):
key = self.kwargs["key"]
emailconfirmation = EmailConfirmationHMAC.from_key(key)
print(f"Key: {key}, Email confirmation: {emailconfirmation}")
if not emailconfirmation:
if queryset is None:
queryset = self.get_queryset()
try:
emailconfirmation = queryset.get(key=key.lower())
except EmailConfirmation.DoesNotExist:
raise Http404()
return emailconfirmation
型
在测试时,我确保用这些自定义视图覆盖accounts视图。(请注意,自定义视图和源代码视图仍然存在此问题)。
在调试时,我将问题追溯到源HTML模板中的can_confirm布尔值。
{% if confirmation %}
{% user_display confirmation.email_address.user as user_display %}
{% if can_confirm %}
型
该表单从不输入,因此can_confirm始终为false。我认为这是由于allauth的get_context_data总是将“can_confirm”设置为false
def get_context_data(self, **kwargs):
ctx = kwargs
site = get_current_site(self.request)
ctx.update(
{
"site": site,
"confirmation": self.object,
"can_confirm": self.object.email_address.can_set_verified(),
"email": self.object.email_address.email,
}
)
return ctx
型
我错过了什么明显的东西吗?
1条答案
按热度按时间vdzxcuhz1#
我通过GitHub找到了解决方案。我的Allauth版本是0.54.0,这与GitHub上主分支中显示的代码不一样。
要解决此问题,请执行以下操作:
1.检查您的Allauth版本(
pip show django-allauth
)1.转到Allauth的GitHub,按下分支概述,然后切换到“标签”选项卡。这将使您对相关代码有一个概述。
1.切换到您的版本并复制模板。这里的问题是
can_confirm
的代码没有在pip版本中发布,所以can_confirm
永远不会是True
。