gpt4 book ai didi

django - 如何判断用户的电子邮件地址是否已使用 Django、allauth、rest-auth 和自定义用户进行验证

转载 作者:行者123 更新时间:2023-12-03 18:40:52 25 4
gpt4 key购买 nike

我将 Django 2.0.10 与 rest-framework、rest-auth 和 allauth 一起使用。我有一个自定义用户模型。

我使用 allauth View 进行了电子邮件验证。当用户注册时发送验证电子邮件。如果我单击电子邮件中的链接,我将被带到一个页面,其中有一个按钮可以单击以验证电子邮件。这一切都没有错误。但是,我不知道这实际上是做什么的。用户数据中的字段似乎没有改变。

我想要的行为是让用户能够注册和登录,但只能在他们验证电子邮件后才能向网站添加内容。

编辑:this post 给出了部分答案,但没有说明如何将验证状态保存为用户的属性,以便您在加载用户数据时可以在前端进行检查。

设置.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'),
...
]

用户/模型.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

当用户登录时,我如何知道他们是否已经验证了他们的电子邮件地址?谢谢你的帮助!

最佳答案

啊哈!感谢 this postthis post ,我想我有了答案。

电子邮件地址的状态保存在单独的表格 EmailAdress 中,而不是作为用户模型的一部分。这可以在模型 View 集中访问,如下所示:

api.py

from allauth.account.admin import EmailAddress

class ListViewSet(viewsets.ModelViewSet):
...

def get_queryset(self):
# can view public lists and lists the user created
if self.request.user.is_authenticated:
print('is there a verified email address?')
print(EmailAddress.objects.filter(user=self.request.user, verified=True).exists())

...

如果用户有任何经过验证的电子邮件地址,这将返回 True。

但是,向用户添加验证状态更有用。这可以通过 here 解释的信号来完成。

View .py
from allauth.account.signals import email_confirmed
from django.dispatch import receiver

@receiver(email_confirmed)
def email_confirmed_(request, email_address, **kwargs):
user = email_address.user
user.email_verified = True

user.save()

现在在 api.py 中你可以这样检查:
print(self.request.user.email_verified)

如果您有一个无法更改或删除的电子邮件地址,则此方法有效。如果您允许多个电子邮件地址,我想您需要进行更多检查并相应地更新用户的状态。但是我只有一个用于登录的电子邮件地址,所以我认为没关系。

我认为将“email_verified”作为用户配置文件的一部分是更好的做法,但这是一个有效的演示。

关于django - 如何判断用户的电子邮件地址是否已使用 Django、allauth、rest-auth 和自定义用户进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467321/

25 4 0
文章推荐: nodemailer 因连接被拒绝而失败,使用已知良好的 SMTP 服务器
文章推荐: reactjs - 未捕获的类型错误 : Cannot assign to read only property '' of object '#'