我们在生产中使用 django-allauth 已经有一段时间了。我们可以启用帐户电子邮件验证,效果很好。但是我们现在有一个 REST api,它允许用户通过 API 注册,并且工作流不通过 django-allauth。是否可以手动调用 django-allauth 电子邮件验证功能,或者我们是否需要使用自定义解决方案?
我将在这里发布我的答案,因为我一直在寻找使用 Django 内置身份验证(并使用自定义身份验证模型)添加电子邮件验证,我使用了 Marcus 提到的方法,我将添加所有其他内容对于任何想要做同样事情的人来说。
首先:按照此处所述安装 django-allauth
第二:在settings.py文件中添加您的电子邮件配置:
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com' #I used gmail in my case
EMAIL_HOST_USER = <Your Email>
EMAIL_HOST_PASSWORD = <Your Password>
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = <Default Sender name and email>
Run Code Online (Sandbox Code Playgroud)
第三:添加验证和默认登录 url 的配置,您将在此处找到所有配置参数的文档,请注意,在我的示例中,我使用的是前面提到的自定义用户模型,这就是我设置ACCOUNT_EMAIL_REQUIRED为True&ACCOUNT_USER_MODEL_USERNAME_FIELD和ACCOUNT_USERNAME_REQUIREDto 的原因False,在用户单击通过电子邮件发送给他的确认链接后LOGIN_URL,也会使用,ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL和LOGIN_REDIRECT_URL参数
ACCOUNT_EMAIL_VERIFICATION='mandatory'
ACCOUNT_CONFIRM_EMAIL_ON_GET=True
ACCOUNT_EMAIL_REQUIRED=True
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'
LOGIN_URL='app:login_user'
LOGIN_REDIRECT_URL='app:login_user'
ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL='app:login_user'
Run Code Online (Sandbox Code Playgroud)
第四:在您的注册表单后,保存is_active参数设置为的用户实例False,然后调用方法:
from allauth.account.utils import *
send_email_confirmation(request, user, True)
Run Code Online (Sandbox Code Playgroud)
最后:收到用户确认邮件后的信号,并设置is_active为True
from allauth.account.signals import email_confirmed
from django.dispatch import receiver
# Signal sent to activate user upon confirmation
@receiver(email_confirmed)
def email_confirmed_(request, email_address, **kwargs):
user = MyUser.objects.get(email=email_address.email)
user.is_active = True
user.save()
Run Code Online (Sandbox Code Playgroud)
最后,您可能希望从 Django Admin 更改默认站点名称,因为它将包含在发送的电子邮件中。
| 归档时间: |
|
| 查看次数: |
2105 次 |
| 最近记录: |