【发布时间】:2015-11-23 17:33:37
【问题描述】:
我们在生产环境中使用 django-allauth 已经有一段时间了。我们可以启用帐户电子邮件验证,效果很好。但是我们现在有一个允许用户通过 API 注册的 REST api,并且工作流不通过 django-allauth。是否可以手动调用 django-allauth 电子邮件验证功能,还是我们需要使用自定义解决方案?
【问题讨论】:
标签: django-allauth
我们在生产环境中使用 django-allauth 已经有一段时间了。我们可以启用帐户电子邮件验证,效果很好。但是我们现在有一个允许用户通过 API 注册的 REST api,并且工作流不通过 django-allauth。是否可以手动调用 django-allauth 电子邮件验证功能,还是我们需要使用自定义解决方案?
【问题讨论】:
标签: django-allauth
我将在这里发布我的答案,因为我一直在寻找使用 Django 内置身份验证(并使用自定义身份验证模型)添加电子邮件验证,我使用了 Marcus 提到的方法,我将添加所有对于任何想要做同样事情的人来说,它周围的其他东西。
首先:按照here的描述安装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>
第三:添加验证配置和默认登录url,你会发现所有配置参数的文档here,注意在我的例子中我使用的是自定义用户模型,这就是为什么我将ACCOUNT_EMAIL_REQUIRED设置为True&ACCOUNT_USER_MODEL_USERNAME_FIELD和ACCOUNT_USERNAME_REQUIRED设置为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'
第四:在你的注册表单之后,将is_active参数设置为False的用户实例保存,然后调用方法:
from allauth.account.utils import *
send_email_confirmation(request, user, True)
最后:收到用户确认邮件后的信号,将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()
最后,您需要更改 Django Admin 的默认站点名称,因为它将包含在发送的电子邮件中。
【讨论】:
我遇到了同样的问题,我找到的解决方案是从 allauth 调用原始的 send_email_confirmation 方法。我正在为我的 API 使用 DRF3。
from allauth.account.utils import send_email_confirmation
...
def some_view(request):
user = ...
...
#using request._request to avoid TypeError on change made in DRF3 (from HTTPRequest to Request object)
send_email_confirmation(request._request, user)
...
希望对你有帮助。
【讨论】: