如何判断用户';已使用Django、allauth、rest auth和自定义用户验证了的电子邮件地址

如何判断用户';已使用Django、allauth、rest auth和自定义用户验证了的电子邮件地址,django,django-allauth,email-confirmation,Django,Django Allauth,Email Confirmation,我将Django 2.0.10与rest框架、rest auth和allauth一起使用。我有一个自定义的用户模型 我使用allauth视图进行了电子邮件验证。验证电子邮件在用户注册时发送。如果我点击电子邮件中的链接,我会被带到一个页面,页面上有一个按钮可以点击验证电子邮件。这一切都是正确的。然而,我不知道这到底是怎么回事。用户数据中的字段似乎没有变化 我想要的行为是用户能够注册和登录,但只能在他们验证电子邮件后向网站添加内容 编辑:给出部分答案,但没有说明如何将验证状态保存为用户的属性,以便在

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

我使用allauth视图进行了电子邮件验证。验证电子邮件在用户注册时发送。如果我点击电子邮件中的链接,我会被带到一个页面,页面上有一个按钮可以点击验证电子邮件。这一切都是正确的。然而,我不知道这到底是怎么回事。用户数据中的字段似乎没有变化

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

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

设置.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/url.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'),
...
]
当用户登录时,我如何知道他们是否已验证其电子邮件地址?谢谢你的帮助

啊哈!多亏了和,我想我有了答案

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

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

但是,向用户添加验证状态更有用。这可以通过如上所述的信号来完成

views.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)
如果您只有一个无法更改或删除的电子邮件地址,则此功能可以正常工作。如果您允许使用多个电子邮件地址,我想您需要进行更多检查,并相应地更新用户的状态。但我只有一个用于登录的电子邮件地址,所以我认为这没关系


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

我也遇到了同样的问题,我能够通过使用以下代码解决这个问题:

#Project-level folder urls.py
from django.contrib import admin
from django.urls import path, include
from allauth.account.views import ConfirmEmailView, EmailVerificationSentView 
#These ConfirmEmailView, EmailVerificationSentView are very important
#I used other allauth/ dj-rest-auth views and they didn't automatically verify the email.

urlpatterns = [
path('admin/', admin.site.urls),
path('dj-rest-auth/registration/account-confirm-email/<str:key>/',
    ConfirmEmailView.as_view()), #This is at the top because apparently won't work if below. #Integral to problem solution

path('dj-rest-auth/', include('dj_rest_auth.urls')),
path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')),
path('api-auth', include('rest_framework.urls')),

 path('dj-rest-auth/registration/account-confirm-email/', 
  EmailVerificationSentView.as_view(),
        name='account_email_verification_sent'),#Integral to problem solution

]
#项目级文件夹url.py
从django.contrib导入管理
从django.url导入路径,包括
从allauth.account.views导入确认邮件视图,EmailVerificationSentView
#这些ConfirmMailView、EmailVerificationSentView非常重要
#我使用了其他allauth/dj rest auth视图,它们没有自动验证电子邮件。
URL模式=[
路径('admin/',admin.site.url),
路径('dj-rest-auth/registration/account confirm email/',
ConfirmEmailView.as_view()),#这在顶部,因为如果在下面,显然不起作用。#是问题解决方案的组成部分
路径('dj-rest-auth/',包括('dj_rest_auth.url'),
路径('dj-rest-auth/registration/',包括('dj_rest_auth.registration.url'),
路径('api-auth',包括('rest\u framework.url')),
路径('dj-rest-auth/注册/帐户确认电子邮件/',
EmailVerificationSentView.as_view(),
name='account.\u email.\u verification.\u sent'),#是问题解决方案的组成部分
]

上面的代码允许我使用注册url创建新用户。之后会发送一封带有链接的电子邮件。当用户点击链接时,他们将被重定向到登录页面,其电子邮件现在已在数据库中验证。

最简单的解决方案是在注册时向用户发送电子邮件确认时,将
user.is\u active
设置为
False
。并在确认电子邮件时,将
user.is_active
设置为
True
。同样,在没有确认电子邮件的注册用户尝试登录之前,请检查该用户是否具有
is\u状态
<代码>真或
。如果其
为False
,则您不允许他们登录。谢谢,但我希望用户能够立即登录,而不是创建内容。一个原因是,他们可以请求新的验证电子邮件,例如,如果电子邮件没有到达或在垃圾邮件中丢失。然后,您可以简单地在他们的配置文件中添加一个布尔类型的额外字段,即
verified
,然后根据他们是否已确认电子邮件,将其设置为
True
False
。然后,您可以使用此信息不允许他们编辑内容。您能解释一下我将如何做吗?我很乐意更改我的代码,但我不想重写allauth代码。这篇文章是我获得如何检查电子邮件地址状态的信息的地方,但它没有解释在验证电子邮件地址时如何更改用户对象?
#Project-level folder urls.py
from django.contrib import admin
from django.urls import path, include
from allauth.account.views import ConfirmEmailView, EmailVerificationSentView 
#These ConfirmEmailView, EmailVerificationSentView are very important
#I used other allauth/ dj-rest-auth views and they didn't automatically verify the email.

urlpatterns = [
path('admin/', admin.site.urls),
path('dj-rest-auth/registration/account-confirm-email/<str:key>/',
    ConfirmEmailView.as_view()), #This is at the top because apparently won't work if below. #Integral to problem solution

path('dj-rest-auth/', include('dj_rest_auth.urls')),
path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')),
path('api-auth', include('rest_framework.urls')),

 path('dj-rest-auth/registration/account-confirm-email/', 
  EmailVerificationSentView.as_view(),
        name='account_email_verification_sent'),#Integral to problem solution

]