【问题标题】:django-rest-auth: What is the email verification for and how can I let the user activate the account correctly?django-rest-auth:什么是电子邮件验证,如何让用户正确激活帐户?
【发布时间】:2019-08-13 16:06:25
【问题描述】:

我可能会误解一些东西。 django-rest-auth 提供RegisterView 并且应该在用户注册后将电子邮件发送到用户的电子邮件。但是,我注意到用户甚至在用户确认电子邮件之前就已注册is_active=True。那么,邮箱验证有什么用呢?当用户注册网站时,我是否必须覆盖某些内容并使用is_active=False 创建用户?如果是这样,我怎样才能正确地实现它?我遇到了麻烦。

这就是我所做的。

urls.py

path('api/v1/rest-auth/registration/', include('rest_auth.registration.urls')),

serializers.py

from rest_auth.registration.serializers import RegisterSerializer

class CustomRegistrationSerializer(RegisterSerializer):

    def save(self, request):
        user = super(CustomRegistrationSerializer, self).save(request)
        user.is_active = False
        return user

settings.py

REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'appname.serializers.CustomRegistrationSerializer',
}

这是我遇到的一个错误。

文件“rest_auth/registration/views.py”,第 46 行,在调度中 return super(RegisterView, self).dispatch(*args, **kwargs)

文件“/rest_framework/views.py”,第 495 行,在调度中 响应 = self.handle_exception(exc)

文件“rest_framework/views.py”,第 455 行,在 handle_exception 中 self.raise_uncaught_exception(exc)

文件“rest_framework/views.py”,第 492 行,在调度中 response = handler(request, *args, **kwargs)

文件“rest_framework/generics.py”,第 192 行,在帖子中 return self.create(request, *args, **kwargs)

文件“rest_auth/registration/views.py”,第 65 行,在创建中 user = self.perform_create(serializer)

文件“rest_auth/registration/views.py”,第 81 行,在 perform_create 无)

文件“allauth/account/utils.py”,第 183 行,在 complete_signup 中 signal_kwargs=signal_kwargs)

文件“/allauth/account/utils.py”,第 133 行,在 perform_login 中 return adapter.respond_user_inactive(request, user)

文件“allauth/account/adapter.py”,第 454 行,在 respond_user_inactive 反向('account_inactive'))

文件“django/urls/resolvers.py”,第 622 行,在 _reverse_with_prefix 提高 NoReverseMatch(味精) django.urls.exceptions.NoReverseMatch:找不到“account_inactive”的反向。 “account_inactive”不是有效的视图函数或模式名称。

我想听听使用django-rest-auth 的人如何处理注册。 有人用过django-rest-auth 并且可以给我提示吗?

【问题讨论】:

    标签: django django-rest-framework django-rest-auth


    【解决方案1】:

    django rest auth 使用一个额外的表来处理电子邮件,该表具有电子邮件帐户和一个标志(如果它们已通过验证)。

    它来自django-allauth

    【讨论】:

      【解决方案2】:

      is_active 其实不是为了这个目的。当我不想删除用户时,我将其用作管理员来停用用户。您可能想改用ACCOUNT_EMAIL_VERIFICATION = "mandatory"

      ACCOUNT_EMAIL_VERIFICATION(=“可选”)

      在注册期间确定电子邮件验证方法 - 选择 "mandatory""optional""none" 之一。当设置为“强制”时,用户将被阻止登录,直到电子邮件地址得到验证。选择“可选”或“无”以允许使用未经验证的电子邮件地址登录。如果是“可选”,则仍然发送电子邮件验证邮件,而如果为“无”,则不发送电子邮件验证邮件。

      来源:https://django-allauth.readthedocs.io/en/latest/configuration.html

      许多网站需要双重选择来验证电子邮件地址的有效性或出于法律目的,您可以通过引用设置来完成此操作。


      关于NoReverseMatch异常,你应该可以用下面的代码解决它(但我认为你切换到ACCOUNT_EMAIL_VERIFICATION = "mandatory"时可能不需要它):

      urlpatterns = [
          ...
          url(r'^accounts/', include('allauth.urls')),
          ...
      ]
      

      文档:https://django-allauth.readthedocs.io/en/latest/installation.html

      但是,如果 Django 只是一个后端,您可能不需要此视图或想要覆盖它。要了解如何执行此操作,您可以查看我的 gist,其中我还覆盖了适配器,因为有一个我不需要的 URL。

      【讨论】:

      • 完全不同意您回答的第一部分。 is_active 应该完全满足该目的。如果您不使用它,则根本没有状态或数据库记录表明用户是否验证了他们的邮件。
      • is_active 字段不仅仅是一个电子邮件验证确认标志,它是django.contrib.auth 的一部分。我会添加自己的自定义 is_email_verified 字段,并在 email_confirmed 信号上将其设置为 True 或使用 django-allauth 的 EmailAddress.objects.filter(user=self.request.user, verified=True).exists() 签入视图。
      猜你喜欢
      • 2017-06-22
      • 2020-02-15
      • 2014-08-17
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2017-02-20
      • 2020-02-21
      • 2014-09-16
      相关资源
      最近更新 更多