【发布时间】:2019-06-25 07:29:05
【问题描述】:
我正在使用带有 rest-framework、rest-auth 和 allauth 的 Django 2.0.10。我有一个自定义用户模型。
我已使用 allauth 视图进行电子邮件验证。验证电子邮件在用户注册时发送。如果我单击电子邮件中的链接,我会被带到一个页面,该页面带有一个按钮以单击以验证电子邮件。这一切都没有错误。但是,我不知道这实际上是什么。用户数据中的任何字段似乎都没有变化。
我想要的行为是让用户能够注册和登录,但只有在他们验证了他们的电子邮件后才能向网站添加内容。
编辑:this post 给出了部分答案,但没有说明如何将验证状态保存为用户的属性,以便您在加载用户数据时可以在前端进行检查。
settings.py
# django rest auth
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = False
OLD_PASSWORD_FIELD_ENABLED = True
LOGOUT_ON_PASSWORD_CHANGE = False
ACCOUNT_EMAIL_VERIFICATION = 'optional'
api/urls.py
from allauth.account.views import confirm_email
urlpatterns = [
re_path(r'^rest-auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$', confirm_email,
name='account_confirm_email'),
...
]
users/models.py
import uuid
from django.contrib.auth.models import AbstractUser, UserManager
from django.db import models
from django.utils.http import int_to_base36
class CustomUserManager(UserManager):
def get_by_natural_key(self, username):
case_insensitive_username_field = '{}__iexact'.format(self.model.USERNAME_FIELD)
return self.get(**{case_insensitive_username_field: username})
ID_LENGTH = 12
def pkgen():
from base64 import b32encode
from hashlib import sha1
from random import random
pk = int_to_base36(uuid.uuid4().int)[:ID_LENGTH]
return pk
class CustomUser(AbstractUser):
objects = CustomUserManager()
slug = models.CharField(max_length=ID_LENGTH, default=pkgen, editable=False)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
def __str__(self):
return self.email
当用户登录时,我怎样才能知道他们是否已经验证了他们的电子邮件地址?感谢您的帮助!
【问题讨论】:
-
最简单的解决方案是在注册时向用户发送电子邮件确认时将
user.is_active设置为False。并在他/她确认电子邮件时将user.is_active设置为True。同样在没有确认电子邮件的注册用户尝试登录之前,您检查该用户是否有is_status..True或False。如果是False,则不允许他们登录。 -
谢谢,但我希望用户能够立即登录,而不是创建内容。一个原因是他们可以请求新的验证电子邮件,例如,如果它没有到达或者他们在垃圾邮件中丢失了它。
-
然后你可以简单地在他们的个人资料中添加一个布尔类型的额外字段,即
verified,然后根据他们是否确认电子邮件将其设置为True或False。然后,您可以使用此信息来禁止他们编辑内容。 -
你能解释一下我会怎么做吗?我很高兴更改我的代码,但我不想重写 allauth 代码。
-
该帖子是我获得如何检查电子邮件地址状态的信息的地方,但它没有说明在验证电子邮件地址后如何更改用户对象?
标签: django django-allauth email-confirmation