我有一个自定义的用户模型。并且我使用Django rest auth来处理用户的身份验证。 问题是注册后发送电子邮件后的问题。如果用户没有在电子邮件过期之前对其进行验证,则似乎该电子邮件将无限期地停留在该状态。我期望从文档中的ACCOUNT_EMAIL_VERIFICATION = "mandatory"
开始在我的设置中再次发送验证电子邮件,该文档默认情况下应重新发送验证消息,但这没有发生。我不知道该怎么办,而且似乎找不到任何有用的资源。
下面是我的模特
models.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"
答案 0 :(得分:2)
最终,我能够以不同的方式解决此问题,我创建了一个视图和URL来请求用户电子邮件,然后在未验证用户的情况下向他们发送链接。
views.py
41.201.181.27 - [2019-04-06 18:22:02] "GET /images/stands/photo_mois.jpg HTTP/1.1" 304 - "http://example.com/popup.php?choix=mois" "Mozilla/4.0" "-"
urls.py
cut -f4 -d\" < logfile | sort -u
答案 1 :(得分:1)
首先,您提到您正在使用django-rest-auth
,但事实并非如此,您可能正在使用django-allauth
。
根据django-allauth
的文档:
ACCOUNT_EMAIL_VERIFICATION :
设置为“强制”时,用户将无法登录,直到验证电子邮件地址为止。选择“可选”或“无”以允许使用未经验证的电子邮件地址登录。如果为“可选”,则仍发送电子邮件验证邮件,而如果为“无”,则不发送电子邮件验证邮件。
因此,如果第一封电子邮件过期,则没有提及重新发送验证电子邮件。要完成您想要的工作,您应该运行job
脚本并检查expired
验证令牌,然后手动重新发送验证电子邮件。
您应该创建一个类似于以下内容的脚本:
from time import sleep
from django.utils import timezone
from django_allauth.account.models import EmailConfirmation
while True:
def_expired = timezone.now() - datetime.timedelta(days=app_settings.EMAIL_CONFIRMATION_EXPIRE_DAYS)
expired_tokens = EmailConfirmation.objects.filter(sent__lte=def_expired)
for token in expired_tokens:
token.send()
sleep(2)
并使用您喜欢的任何调度程序(supervisor
,pm2
,cronjob
等)使该脚本运行。
底线django-allauth
不具有/不具有所需的功能。这项工作需要手动完成。