【问题标题】:django-allauth change user email with/without verificationdjango-allauth 在有/没有验证的情况下更改用户电子邮件
【发布时间】:2013-11-14 07:50:28
【问题描述】:

我正在使用没有任何社交帐户的普通 django-allauth。每个用户都应该有一个与其帐户关联的电子邮件地址,即用于注册/验证的电子邮件地址。我想让我的用户更改此电子邮件。

所以我的第一个问题是,我是否应该通过发送验证电子邮件来再次验证新电子邮件?我的直觉告诉我,我最好让这封新电子邮件得到验证。但我对此没有真正的论据。

我的第二个问题是,如果要验证这一点,django-allauth 是否已经以某种方式支持该过程?我见过 EmailView 和 AddEmailForm。但这些都是基于一个帐户可以拥有多个电子邮件地址的假设(这不是我想要的)。

谢谢

【问题讨论】:

标签: django email django-allauth


【解决方案1】:

我认为应该验证新的电子邮件地址。如果您的应用程序定期发送电子邮件,您不希望将大量电子邮件发送到用户输入的任何电子邮件地址。

我所做的是允许多个电子邮件地址,直到第二个电子邮件得到验证。然后,按照 elssar 的建议收听 django-allauth 的 email_confirmed 信号。验证地址后,将新电子邮件地址设置为主电子邮件,然后删除任何以前的 EmailAddess。这是我最终做的一个简化示例:

型号:

from django.dispatch import receiver
from allauth.account.models import EmailAddress
from allauth.account.signals import email_confirmed

class CustomUser(models.Model):
    ...
    def add_email_address(self, request, new_email):
        # Add a new email address for the user, and send email confirmation.
        # Old email will remain the primary until the new one is confirmed.
        return EmailAddress.objects.add_email(request, self.user, new_email, confirm=True)

@receiver(email_confirmed)
def update_user_email(sender, request, email_address, **kwargs):
    # Once the email address is confirmed, make new email_address primary.
    # This also sets user.email to the new email address.
    # email_address is an instance of allauth.account.models.EmailAddress
    email_address.set_as_primary()
    # Get rid of old email addresses
    stale_addresses = EmailAddress.objects.filter(
        user=email_address.user).exclude(primary=True).delete()

观看次数:

def update_user_details(request):
    user = request.user
    new_email = request.POST.get('new_email')
    user.custom_user.add_email_address(request, new_email)
    ...

【讨论】:

  • 也许我遗漏了一些东西,但在我看来,要实现单个电子邮件地址,您需要做的就是导入,以及来自@receiver… 的代码在models 中。即您不需要CustomUser 模型或views 中的代码
  • @typonaut 您可以使用较少的工作来拥有一个电子邮件地址,但此解决方案还可以让您更新电子邮件地址,同时仍防止用户保留多封电子邮件
【解决方案2】:

有几种方法可以做到这一点。

要么监听email_confirmed 信号处理程序,并拥有一个函数来检查用户是否有两个EmailAccount 对象与他的帐户关联,如果有,则删除另一个EmailAccount 对象。

另一个将在您的设置中设置EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URLEMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL,并让相关视图删除额外的电子邮件地址(如果存在)。

另一种方法是覆盖 EmailView 和/或 AddEmailForm 并让他们做你想做的事。

对于未经确认更改电子邮件,您可以让您的视图调用EmailAddress.change 方法。

【讨论】:

  • 当我们使用EmailAddress.changeemail_changed 信号应该被触发?如果我错了,请纠正我。
  • @Prakhar 我已经很久没有使用过allauth了,所以我可能错了,但是从快速扫描代码来看,当用户更改他们的主要电子邮件地址时,似乎触发了email_changed 信号一个电子邮件对象到另一个。 EmailAddress.change 更改同一对象中电子邮件的值。
猜你喜欢
  • 2020-11-17
  • 2014-04-23
  • 2020-09-13
  • 1970-01-01
  • 2015-10-22
  • 2020-10-28
  • 2019-11-23
  • 2020-11-02
  • 2011-12-29
相关资源
最近更新 更多