django - allauth 未验证的电子邮件在电子邮件过期后仍处于未验证状态
问题描述
我有一个自定义用户模型。我使用 Django rest auth 来处理用户的身份验证。问题是在发送电子邮件时注册后。如果用户在电子邮件过期之前没有验证它,它似乎会无限期地保持这样的状态。我希望再次发送验证电子邮件,因为ACCOUNT_EMAIL_VERIFICATION = "mandatory"
在我的设置中,从文档中,它应该默认重新发送验证消息,但这并没有发生。我不知道还能做什么,我似乎找不到任何有帮助的资源。
下面是我的模型
模型.py
class User(AbstractBaseUser, PermissionsMixin):
username = None
email = models.EmailField(max_length=254, unique=True)
name = models.CharField(max_length=250)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
slug = models.SlugField(max_length=255, unique=True, blank=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']
在我的settings.py中,用户的有效期为 2 天
ACCOUNT_AUTHENTICATED_LOGIN_REDIRECTS = True
ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = None #or "api/authenticated/"
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 1
ACCOUNT_EMAIL_CONFIRMATION_HMAC = False
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
EMAIL_VERIFICATION = "mandatory"
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "http"
ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN = 3600
ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 5
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 180
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = False
ACCOUNT_LOGOUT_ON_GET = True
ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = True
ACCOUNT_LOGIN_ON_PASSWORD_RESET = False
ACCOUNT_LOGOUT_REDIRECT_URL = "api/login/"
ACCOUNT_SESSION_REMEMBER = True
ACCOUNT_SIGNUP_EMAIL_ENTER_TWICE = False
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USER_MODEL_EMAIL_FIELD = "email"
解决方案
最终,我能够以不同的方式解决这个问题,我创建了一个视图和 URL,它请求用户发送电子邮件,然后在他们未经验证的情况下向他们发送一个链接。
视图.py
from allauth.account.utils import send_email_confirmation
from allauth.account.admin import EmailAddress
from rest_framework.exceptions import APIException
class EmailConfirmation(APIView):
permission_classes = [AllowAny]
def post(self, request):
user = get_object_or_404(User, email=request.data['email'])
emailAddress = EmailAddress.objects.filter(user=user, verified=True).exists()
if emailAddress:
return Response({'message': 'This email is already verified'}, status=status.HTTP_400_BAD_REQUEST)
else:
try:
send_email_confirmation(request, user=user)
return Response({'message': 'Email confirmation sent'}, status=status.HTTP_201_CREATED)
except APIException:
return Response({'message': 'This email does not exist, please create a new account'}, status=status.HTTP_403_FORBIDDEN)
网址.py
path('verify-email/again/', qv.EmailConfirmation.as_view(), name='resend-email-confirmation'),
推荐阅读
- sql - 是否有任何最佳方法来查找行数
- python - TimestampedGeoJson 持续时间参数导致多边形消失
- python - Write one line code to get odd and even numbers in separate arrays
- node.js - 如何使用 Mongoose 进行排序和限制
- c# - Azure 服务总线队列连接问题
- java - '-alias' 不是内部或外部命令、可运行程序或批处理文件
- javascript - 如何保存对 Array 方法的引用?
- javascript - 如何计算项目与当前位置的距离并将其显示在文本中?
- python - 计算目录中多个 csv 文件中的列数
- angular - 角度 5 确认方法上的 Alertifyjs 失败