Django密码重置多个账户

5
你好,我正在尝试在Django中创建密码重置视图。我已经设置了邮件后端、URL和模板。一切看起来都很好,但是当我尝试发送重置密码邮件时,Django会同时发送多个邮件。例如,7或11封密码重置电子邮件。我该如何使它每次只发送一封邮件。
谢谢!
以下是我做的事情:
setting.py:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST_USER = "my_email"
EMAIL_HOST_PASSWORD = "my_password"
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

urls.py

path('password-reset/',
     auth_views.PasswordResetView.as_view(template_name='accounts/password_reset.html'),
     name='password_reset'),
path('password-reset/done/',
     auth_views.PasswordResetDoneView.as_view(template_name='accounts/password_reset_done.html'),
     name='password_reset_done'),
path('password-set-confirm/<uidb64>/<token>/',
     auth_views.PasswordResetConfirmView.as_view(template_name='accounts/password_reset_confirm.html'),
     name='password_reset_confirm'),
path('password-set-complete/',
     auth_views.PasswordResetCompleteView.as_view(template_name='accounts/password_reset_complete.html'),
     name='password_reset_complete'),

此外,我为每个视图设置了模板。

欢迎来到 SO。你需要给我们展示一个 [mcve],这样我们才能理解你正在做什么以及哪里出现了问题。 - dirkgroten
请使用代码格式将您的代码粘贴到问题中。此处设置可能不相关。您需要显示处理密码重置表单提交的密码重置视图(以及可能的表单)。 - dirkgroten
我没有解决问题,但它正在向我的电子邮件发送多封有关密码重置的邮件。 - tamurfirat.py
当我点击重置密码时,它会等待一段时间并向目标电子邮件帐户发送多封电子邮件。然后它会跳转到密码重置完成页面。 - tamurfirat.py
不应该发生这种情况。请在您的管理控制台中检查后端是否存在多个相同电子邮件的用户(如果您没有指定电子邮件为唯一值,则可能会出现此问题)。或者在您的控制台中检查User.objects.filter(email="theemail@example.com").count() - dirkgroten
显示剩余2条评论
4个回答

8

如果这仍然是一个问题... 如果您有多个“测试用户”,并且使用相同的电子邮件地址创建它们,则可能会导致问题。


1
我也遇到了同样的问题。哈哈 - Ta_Req
我一开始不知道发生了什么。当我看到这个时... 哦! - Bruno Rijsman

6
有时候查看Django源码本身是有帮助的,如果您不明白发生了什么,请务必深入探索。如果您查看django.contrib.auth.forms中的PasswordResetForm的save()方法,您会看到它循环遍历self.get_users(email),然后为每个用户发送一封(仅一封)电子邮件。因此,唯一可能发送多个电子邮件的方式是如果有多个具有相同电子邮件的用户。

0

我认为没有任何设置可以解决这个问题,你可能会多次调用相同的URL,这可能是一个逻辑问题。尝试使用调试模式或打印语句来帮助解决。


0
PasswordResetForm具有get_users()方法,该方法返回电子邮件中所有活动用户名。我们可以覆盖该方法以仅返回传递给它的1个用户。这样重置密码电子邮件将仅发送给我们选择的1个用户。
from django.contrib.auth.forms import PasswordResetForm


class MyPasswordResetFormSpecificUser(PasswordResetForm):
    """
    Send password reset email to specific user and not all active
    users in an email.
    """
    user = None

    def get_users(self, email):
        """
        Instead of getting all users in an email,
        just sent the user that we want to reset password for.
        """
        return [self.user]

然后,您可以像下面展示的那样在视图中使用这个新的表单类:

email = 'your email here'
form = MyPasswordResetFormSpecificUser({'email': email})
assert form.is_valid()
form.user = 'User object who needs password reset'

# use https only when running on GAE
form.save(
    request=self.request,
    use_https=False # True if you are deploying to https url
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接