【问题标题】:Changing user email address更改用户电子邮件地址
【发布时间】:2011-09-09 17:06:00
【问题描述】:

我想允许用户更改他的电子邮件地址。用户将更改他的电子邮件地址,然后将带有链接的确认电子邮件发送到该地址,在用户单击该链接后,它将更改他在数据库中的电子邮件地址。

我知道 django-generic-confirmation 处理这样的确认,但我想尝试自己做。

要更改电子邮件,我的代码是:

User.objects.get(username=username).update(email=request.POST['email'])

要向该地址发送电子邮件,我会:

if 'Change Email' in request.POST.values():
    from django.core.mail import send_mail
    send_mail(
          'Confirm email change',
          'Click this **link** to confirm your change of email',
          'from@example.com',
          [request.POST['email']]
     )

我将如何延迟数据库中电子邮件的更改,直到用户确认他的电子邮件?我将如何创建一个链接来激活此过程的电子邮件?谢谢。

【问题讨论】:

  • User.objects.get(username=username).update(email=request.POST['email']) 应该是 User.objects.filter(username=username).update(email=request.POST['email'])。此外,直接从 POST 请求中获取电子邮件地址可能不是一个好主意 - 以后没有验证可能会咬你。

标签: django email email-validation


【解决方案1】:

这很简单。您要做的是编写一个至少具有如下模型的应用程序;

class EmailChangeAuth(models.Model):
    auth_key = models.CharField(max_length=42)
    user = models.ForeignKey(User)
    new_email = models.CharField(max_length=256)

使用 UUID4 填写 auth_key,您可以像对待 urlconf 中的 slug 字段一样对待它。

然后编写一个获取 auth_key 的视图,在数据库中搜索它,并将用户的电子邮件更改为 new_email。完成后删除记录。

对于奖励积分,添加过期时间,并偶尔清除任何超过一天的记录。

您可能还想考虑一个安全问题类型系统。许多人可能想要更改电子邮件的主要原因是旧电子邮件已不复存在。例如离开公司,邮件主机消失(现在不太常见)等等等等。

【讨论】:

  • 最好使用UUID字段auth_key = models.UUIDField(default=uuid.uuid4, unique=True)
【解决方案2】:

我将如何延迟数据库中电子邮件的更改,直到用户确认他的电子邮件?

这似乎很愚蠢。您等到他们确认电子邮件。也许这不是你真正要问的。

我将如何创建一个链接来激活此过程的电子邮件?

这没什么意义。想必你问的是如何填写**link**

如果是这样,那就是 Django reverse() 函数的用途。

  1. 为此编写一个视图函数。

  2. 为视图函数选择一个合理的 URL 路径。

  3. 使用reverse 生成插入电子邮件的完整 URL。

【讨论】:

  • 通过延迟电子邮件更改,我的意思是如何使用此“触发器”编写函数。例如,在上面的示例中,我将对 request.POST 'trigger' 进行更改。我如何编写一个函数来触发点击电子邮件?
  • @David542:电子邮件有一个链接。该链接显示一个页面。呈现页面是一个 GET 请求。当此人阅读电子邮件并单击电子邮件中的链接时,就会发生这种情况。您是否使用过向您发送确认电子邮件的网站?请现在就做。请在电子邮件 HTML 上“查看源代码”以查看电子邮件中的链接。
猜你喜欢
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 2022-01-19
  • 2011-02-14
相关资源
最近更新 更多